Django将查询结果附加到查询集

时间:2011-11-17 17:13:37

标签: django django-queryset

在我构建的视图中我需要咨询多个数据库。我想要做的是使用query_set的结果来搜索另一个db表。

我的功能 mydb1_query_set ,我现在需要的是这样的:

for row in mydb1_query_set:
        mydb2_query_set = Mytable.objects.filter(id=row.id)

因此,当我迭代时,我不断添加到最初为空的 mydb2_query_set 。我意识到没有QuerySet.append,所以我如何实现我的目标?任何帮助非常感谢...

4 个答案:

答案 0 :(得分:8)

使用list代替queryset,然后您可以appendextend

mydb2_query = []
for row in mydb1_query_set:
    mydb2_query.extend(list(Mytable.objects.filter(id=row.id)))

答案 1 :(得分:2)

qs1= <QuerySet [<User: 1@gmail.com>, <User: 2@gmail.com>]>
qs2= <QuerySet [<User: 3@gmail.com>, <User: 4@gmail.com>]>
qs3 = qs1 | qs2

res:

qs3 = <QuerySet [<User: 1@gmail.com>, <User: 2@gmail.com>, <User:3@gmail.com>, <User: 4@gmail.com>]>

编辑:链接至文档:

https://docs.djangoproject.com/en/2.1/ref/models/querysets/#operators-that-return-new-querysets

答案 2 :(得分:0)

使用python内置的itertools模块对我来说效果最好。

from itertools import chain

qs1 = Mytable.objects.filter(id=2)
qs2 = Mytable.objects.filter(id=3)

all_queries = chain(qs1, qs2)

以下是文档,以备不时之需:https://docs.python.org/3/library/itertools.html#itertools.chain

答案 3 :(得分:0)

Django 的 Managers 对象 provide a default method 称为 .get_queryset(),它允许您在它之后连接额外的查询:

queryset = MyModel.objects.get_queryset()
if username:
    queryset = queryset.filter(username=username)
if country:
    queryset = queryset.filter(country=country)

您可以轻松地使用 .query 属性获取 SQL,例如:

>>> print(queryset.query)
SELECT `myapp_mymodel`.`id`, `myapp_mymodel`.`username`, `myapp_mymodel`.`country` FROM `myapp_mymodel` WHERE `myapp_mymodel`.`country` = foo