在搜索数据库之后,我最终得到了一组查询集.我想连接这些查询集,就像我们可以用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)
我认为正确的方法是使用|运算符(即,如果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)
你的代码看起来很奇怪!我不知道它是如何工作的以及你在这里做什么,但这是我将如何做查询的事情:
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)
我不明白为什么你需要那个内部循环......
| 归档时间: |
|
| 查看次数: |
6392 次 |
| 最近记录: |