2

假设我有经典ArticleTag模型。如何过滤所有Article至少同时具有标签AB. 因此,应包含带有标签ABC的文章,但不应包含带有标签A和的文章D。谢谢!

4

2 回答 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 回答