[英]Django: How to prefetch related for a model instance. Perhaps by wrapping in a queryset?
[英]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.