【问题标题】:Concat results of querySet into one list将 querySet 的结果合并到一个列表中
【发布时间】:2012-02-20 21:43:23
【问题描述】:
我有一个模型X,包含一个ManyToManyFieldY,我正在尝试将X 的查询集的结果连接到Y 中所有条目的列表中
我知道“简单”的方法是:
for x in X:
for y in x.Y.all():
list.append(y)
对此的推理与我之前的问题有关:
If x in <listOfModels.field> syntax
提前致谢,
【问题讨论】:
标签:
django
django-models
django-templates
【解决方案1】:
使用itertools.chain:
from itertools import chain
chain(SomeModel.objects.all(), OtherModel.objects.all(), ...)
请记住,chain 返回一个可迭代对象,这意味着您可以在 for 循环等中使用它,但您不能进一步过滤 QuerySet 或执行正常的列表操作。
【解决方案2】:
把查询转过来。你对Ys感兴趣,所以你应该查询Ys。
y_list = Y.objects.filter(x__in=X)
【解决方案3】:
您可以尝试将查询集对象链接到一个串联的生成器中:
chained = itertools.chain(*[x.Y.all() for x in X])
print chained
# <itertools.chain object at 0x10100eb90>
for y in chained:
print y