似乎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)
但这并不是很有效.
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( )。
查询集不是 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)
归档时间: |
|
查看次数: |
23061 次 |
最近记录: |