用Pythonic方式与未知数量的参数相交

时间:2018-08-08 07:13:27

标签: python django python-3.x django-models

我必须在未知数量的参数之间创建一个QuerySet.intersection()。

是否有更好的方法编写以下代码?

profileQuerySetList = None
for tag_id in current_tags:
    if profileQuerySetList:
        profileQuerySetList = profileQuerySetList & Profile.objects.filter(tags__id=tag_id)
    else:
        profileQuerySetList = Profile.objects.filter(tags__id=tag_id)
profiles = Profile.objects.intersection(profileQuerySetList)

2 个答案:

答案 0 :(得分:1)

由于intersection方法可以使用生成器表达式将多个查询集作为参数,因此您可以执行以下操作:

profiles = Profile.objects.intersection(*(Profile.objects.filter(tags__id=tag_id) for tag_id in current_tags))

答案 1 :(得分:0)

对我来说,更好的方法是满足您的要求的方法。但是我认为最好像使用in运算符一样编写它。

profiles = Profile.objects.intersection(Profile.objects.filter(tags__id__in=current_tags))

如评论中所述,此Profile.objects.filter(tags__id__in=current_tags)将返回对象的并集。

我认为另一种方法是利用Q运算符并编写如下内容:

queries = [Q(tags__id=id) for id in current_tags]
query = queries.pop()
for q in queries:
    query &= q
profiles = Profile.objects.intersection(Profile.objects.filter(q))