【问题标题】:Is it possible to concatenate QuerySets?是否可以连接查询集?
【发布时间】:2011-12-13 11:47:19
【问题描述】:

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

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])

【问题讨论】:

标签: python django


【解决方案1】:

我认为正确的做法是使用| 运算符(也就是说,如果QuerySets 属于同一类型):

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

【讨论】:

    【解决方案2】:

    您的代码看起来很奇怪!我不知道它是如何工作的以及你在这里做什么,但这是我将如何做查询的方法:

    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 文档:Complex lookups with Q object

    您使用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)
    

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

    【讨论】:

    • 当我卡在“链”中时,它几乎可以正常工作,但您完全正确地了解了效率。最好使查询更智能,而不是运行多个查询的循环。谢谢,帮了大忙。
    • 忽略我想出的代码。你上面的东西非常适合我的需要。我只是在那里尝试过。一问。 '__in' 真的很整洁。我想我也可以对多个 Q() 进行 ORed,但我也很难让它工作。 '__in' 第一次工作。
    猜你喜欢
    • 2012-06-20
    • 2018-11-08
    • 1970-01-01
    • 2014-01-07
    • 2020-12-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多