簡體   English   中英

如何將模型實例添加到django查詢集?

[英]How to add an model instance to a django queryset?

似乎django queryset在某種程度上表現得像python列表。

但據我所知,它不支持list的.append()方法。

我想做的是:

from my_django_app.models import MyModel

queryset = MyModel.objects.none()
queryset.append(MyModel.objects.first())      ## no list's .append() method!

有沒有辦法將模型實例添加到現有的查詢集?

不是。 查詢集是查詢的表示 - 因此是名稱 - 而不是任意實例集合。

如果您確實需要實際的查詢集而不是列表,則可以嘗試累積所需對象的ID,然后通過__in查詢獲取對象:

list_of_ids = []
list_of_ids.append(my_id)
...
queryset = MyModel.objects.filter(id__in=list_of_ids)

但這並不是很有效。

你也可以使用| 運營商創建聯盟:

queryset = MyModel.objects.none()
instance = MyModel.objects.first()
queryset |= MyModel.objects.filter(pk=instance.pk)

但請注意,這將生成不同的查詢,具體取決於您以這種方式追加的項目數,從而使編譯查詢的緩存效率低下。

Queryset不是list

所以

to_list = queryset.values()

要結合queryset

from itertools import chain
result_queryset = list(chain(queryset1, queryset2))

要么

querysets = [queryset1, queryset2]
result_queryset = list(chain(*querysets))

這可以使用union完成。 執行此操作后,結果的類型可以看作<class 'django.db.models.query.QuerySet'> 因此可以組合兩個查詢集。 讓我們看一個例子。

query1 = User.objects.filter(is_active=True)

query2 = User.objects.filter(is_active=False)

combined_query = query1.union(query2)

print (type(combined_query))

上面的程序將打印結果如下,確認它是一個查詢集

<class 'django.db.models.query.QuerySet'>

所以基本上Django執行下面的union查詢。

(SELECT "auth_user"."id", "auth_user"."password", "auth_user"."last_login", "auth_user"."is_superuser", "auth_user"."username", "auth_user"."first_name", "auth_user"."last_name", "auth_user"."email", "auth_user"."is_staff", "auth_user"."is_active", "auth_user"."date_joined" FROM "auth_user" WHERE "auth_user"."is_active" = True) 
UNION 
(SELECT "auth_user"."id", "auth_user"."password", "auth_user"."last_login", "auth_user"."is_superuser", "auth_user"."username", "auth_user"."first_name", "auth_user"."last_name", "auth_user"."email", "auth_user"."is_staff", "auth_user"."is_active", "auth_user"."date_joined" FROM "auth_user" WHERE "auth_user"."is_active" = False)

這也意味着如果使用兩個不同的表嘗試union,則會出現錯誤( django.db.utils.ProgrammingError: each UNION query must have the same number of columns )。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM