是否可以连接QuerySet?

evo*_*ion 5 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]
Run Code Online (Sandbox Code Playgroud)

更新:找到我自己的答案(关于写下问题的事情可能)

只是

from itertools import chain
Run Code Online (Sandbox Code Playgroud)

然后更换

myQuerySet = myQuerySet + myQuerySetTwoD[j]
Run Code Online (Sandbox Code Playgroud)

同

BgpAsnList = chain(BgpAsnList,BgpAsnListTwoD[j])
Run Code Online (Sandbox Code Playgroud)

mcc*_*ccc 5

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

qset = MyModel.objects.none()
for filterString in list_of_filterStrings:
    qset_temp = MyModel.objects.filter(asn=filterString)
    qset = qset | qset_temp
Run Code Online (Sandbox Code Playgroud)


Ski*_*Ski 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)
Run Code Online (Sandbox Code Playgroud)

它是如何工作的?

Blagh.objects.filter(Q(smth='A') | Q(smth='B'))
  will generate query which looks like:
SELECT ... from blagh WHERE smth = 'A' OR smth = 'B'
Run Code Online (Sandbox Code Playgroud)

看看 django 文档:Complex Lookups with Qobject

您的方法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)
Run Code Online (Sandbox Code Playgroud)

我不明白为什么你需要那个内部循环......