我必须在未知数量的参数之间创建一个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)
答案 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))