是否可以连接QuerySet?

时间:2011-12-13 11:47:19

标签: python django

搜索数据库后,我最终得到了一组查询集。我想连接这些查询集,就像我们可以用list元素做的那样。这是可能的还是有更好的方法来做到这一点?这里的最终目标是获取包含字段中一组字符串之一的表行的查询集。

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 个答案:

答案 0 :(得分:5)

我认为正确的方法是使用|运算符(即,如果QuerySet的类型相同):

qset = MyModel.objects.none()
for filterString in list_of_filterStrings:
    qset_temp = MyModel.objects.filter(asn=filterString)
    qset = qset | qset_temp

答案 1 :(得分: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 docs:Complex lookups with Q object

使用itertools的方法将导致对数据库的许多查询。使用我的解决方案,它将是OR子句中WHERE查找的一个查询。

更新

也许更好的解决方案是这样的:

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)

我无法理解为什么你需要内循环......