可以连接QuerySets吗?

6 投票
2 回答
7732 浏览
提问于 2025-04-17 08:17

在搜索数据库后,我得到了一个查询结果的数组。我想把这些查询结果合并在一起,就像我们可以把列表中的元素连接起来一样。这可能吗?或者有没有更好的方法来做到这一点?我的最终目标是获取表中某个字段包含一组字符串的行的查询结果。

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)

我不明白你为什么需要那些内层循环……

撰写回答