如何将模型实例添加到django查询集?

Jun*_*une 20 python django

似乎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!
Run Code Online (Sandbox Code Playgroud)

有没有办法将模型实例添加到现有的查询集?

Feu*_*mel 17

您还可以使用|运算符创建联合:

queryset = MyModel.objects.none()
instance = MyModel.objects.first()
queryset |= MyModel.objects.filter(pk=instance.pk)
Run Code Online (Sandbox Code Playgroud)

但请注意,这将生成不同的查询,具体取决于您以这种方式追加的项目数,从而使编译查询的缓存效率低下.


Dan*_*man 16

不是.查询集是查询的表示- 因此是名称 - 而不是任意实例集合.

如果您确实需要实际的查询集而不是列表,则可以尝试累积所需对象的ID,然后通过__in查询获取对象:

list_of_ids = []
list_of_ids.append(my_id)
...
queryset = MyModel.objects.filter(id__in=list_of_ids)
Run Code Online (Sandbox Code Playgroud)

但这并不是很有效.

  • 为什么这个人与其他人不同意?不太明白为什么两者都有大量+票 (2认同)

Sup*_*ova 11

这可以使用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))
Run Code Online (Sandbox Code Playgroud)

上面的程序将打印结果如下,确认它是一个查询集

<class 'django.db.models.query.QuerySet'>
Run Code Online (Sandbox Code Playgroud)

所以基本上 Django 执行下面的联合查询。

(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)
Run Code Online (Sandbox Code Playgroud)

这也意味着django.db.utils.ProgrammingError: each UNION query must have the same number of columns如果对两个不同的表进行联合尝试,将会出现 error( )。

  • 请注意:“union()”返回的“QuerySet”有限制。例如,它不能再次被“过滤”。有关详细信息,请参阅[联合文档](https://docs.djangoproject.com/en/3.0/ref/models/querysets/#union)。另请参阅我的示例[此处](/sf/answers/4393526371/)。 (4认同)

itz*_*nTV 6

查询集不是 list

所以

to_list = queryset.values()
Run Code Online (Sandbox Code Playgroud)

结合 queryset

from itertools import chain
result_queryset = list(chain(queryset1, queryset2))
Run Code Online (Sandbox Code Playgroud)

或者

querysets = [queryset1, queryset2]
result_queryset = list(chain(*querysets))
Run Code Online (Sandbox Code Playgroud)