可以连接QuerySets吗?
在搜索数据库后,我得到了一个查询结果的数组。我想把这些查询结果合并在一起,就像我们可以把列表中的元素连接起来一样。这可能吗?或者有没有更好的方法来做到这一点?我的最终目标是获取表中某个字段包含一组字符串的行的查询结果。
for i in range(0,(searchDiff+1)):
filterString = str(int(searchRange[0]) + i)
myQuerySetTwoD.append(my.objects.filter(asn=filterString))
for j in range(0,(len(myQuerySetTwoD)-1)):
myQuerySet = myQuerySet + myQuerySetTwoD[j]
更新:我自己找到了答案(也许是写下问题的缘故)
只需
from itertools import chain
然后替换
myQuerySet = myQuerySet + myQuerySetTwoD[j]
为
BgpAsnList = chain(BgpAsnList,BgpAsnListTwoD[j])
2 个回答
5
我觉得正确的方法是使用 |
操作符(前提是 QuerySet
的类型要一样):
qset = MyModel.objects.none()
for filterString in list_of_filterStrings:
qset_temp = MyModel.objects.filter(asn=filterString)
qset = qset | qset_temp
0
你的代码看起来有点奇怪!我完全搞不懂它是怎么工作的,你在这里做了什么。不过,我可以告诉你我会怎么做这个查询:
from django.db.models import Q
myQuery = Q()
for i in range(0,(searchDiff+1)):
filterString = str(int(searchRange[0]) + i)
myQueryTwoD.append(Q(asn=filterString))
for j in range(0,(len(myQueryTwoD)-1)):
myQuery = myQuery | myQueryTwoD[j]
myQuerySet = my.objects.filter(myQuery)
这个是怎么工作的呢?
Blagh.objects.filter(Q(smth='A') | Q(smth='B'))
will generate query which looks like:
SELECT ... from blagh WHERE smth = 'A' OR smth = 'B'
你可以看看Django的文档:使用Q
对象进行复杂查询
你用itertools
的方法会导致对数据库发出很多次查询。而我提供的解决方案只需要一次查询,并且在WHERE
条件中使用OR
。
更新:
也许更好的解决方案可以是这样的:
strings = []
for i in range(0,(searchDiff+1)):
filterString = str(int(searchRange[0]) + i)
strings.append(filterString)
my_query_set = MyModel.objects.filter(arn__in=strings)
我不明白你为什么需要那些内层循环……