【发布时间】:2014-11-07 23:28:41
【问题描述】:
假设我们有如下定义的 Django 模型:
class Tag(models.Model):
name=models.CharField(unique=True,max_length=50)
class Article(models.Model):
title=models.CharField(max_length=100)
text=models.TextField()
tag = models.ManyToManyField(Tag)
我们有一个标签列表:
tag_list = ['tag1','tag2','tag3']
目标是选择具有来自tag_list 的所有标签的文章。这个question 展示了一种通过顺序添加过滤条件来实现此目的的方法:
articles = Articles.objects.filter(Q(tag__name=tag_list[0])).filter(Q(tag__name=tag_list[1])).filter(Q(tag__name=tag_list[2]))
但是我们需要动态添加条件。下面的查询不起作用:
qlist=[]
for tag in tag_list:
qlist.append(Q(tag__name=tag))
articles = Articles.objects.filter(reduce(operator.and_, qlist))
我最终从列表中查询了至少有一个标签的文章,然后手动过滤了查询结果:
qlist=[]
qlist.append(Q(tag__name__in=tag_list))
articles = Articles.objects.filter(reduce(operator.and_, qlist)).distinct()
for article in articles:
article_tag_list=[]
for tag in article.tag.all():
article_tag_list.append(tag.name)
if set(tag_list).issubset(set(article_tag_list)):
...
有没有办法为ManyToManyField动态添加查询条件?
【问题讨论】:
标签: django django-models orm