假设我有经典Article
和Tag
模型。如何过滤所有Article
至少同时具有标签A
和B
. 因此,应包含带有标签A
、B
和C
的文章,但不应包含带有标签A
和的文章D
。谢谢!
问问题
701 次
2 回答
0
这个问题可能很老,但我没有在 django 中找到任何内置解决方案(如 __in 过滤器标签)
所以要保持你的榜样。我们在文章和标签之间有 M2M 关系,并且想要获取所有具有给定标签 A、B、C 的文章。在 Django 中没有直接的解决方案,我们必须回想 SQL(不用担心,我们仍然可以在 Django ORM 中做任何事情) 在 M2M 关系中,需要一个公共表来连接这两种关系。我们称它为 TagArticle。此表中的一行只是一个标签和一个文章 ID。
我们实际上必须做的是:
1) 过滤常见的TagsArticle 表以仅获取带有A、B 或C 标签的行。
2)按文章对找到的行进行分组并计算行数。
3)过滤掉所有计数小于标签数量的行(在我们的例子中为3)
4) 现在用之前的结果加入或过滤文章表
幸运的是,我们不必直接在 Django 中访问 TagArticle 表。那么伪代码是:
from django.db.models import Count
...
tags = ['A', 'B', 'C']
articleQS = Tag.objects.filter(name__in=tags).values('article')
.annotate(tagCount=Count('article'))
.filter(catCount=len(tags)).values('article')
articles = Article.objects.filter(id__in=articleQS)
于 2017-08-03T20:38:04.567 回答
-1
假设标签是:
class Tag(models.model):
article = models.ForeignKey('Article')
name = models.CharField(max_length=2)
然后我认为你可以这样做:
a_ids = Tag.objects.filter(name='A').values_list('article_id')
b_ids = Tag.objects.filter(name='B').values_list('article_id')
Article.objects.filter(id__in=a_ids).filter(id__in=b_ids)
于 2013-04-28T20:35:33.230 回答