簡體   English   中英

Django:如何過濾多對多字段的子集?

[英]Django: how to filter on subset of many-to-many field?

假設我有經典的ArticleTag模型。 如何過濾所有至少具有標簽AB Article模型。 因此,應包括帶有標簽ABC的文章,但不包括帶有標簽AD的文章。 謝謝!

這個問題可能很舊,但是我在django中沒有找到任何內置解決方案(例如__in filter標簽)

因此,保持您的榜樣。 我們在文章和標簽之間具有M2M關系,並希望獲得所有具有給定標簽A,B,C的文章。 Django中沒有簡單的解決方案,我們必須回想起SQL(不用擔心,我們仍然可以在Django ORM中完成所有工作)。在M2M關系中,需要有一個將兩個關系連接在一起的公用表。 我們稱之為TagArticle。 該表中的一行只是標簽和商品ID。

我們實際上要做的是:

1)過濾通用的TagArticle表,以僅獲取帶有A,B或C標簽的行。

2)按文章對找到的行進行分組,並對行進行計數。

3)篩選出計數小於標簽數量的所有行(在我們的示例中為3)

4)現在使用上一個結果聯接或過濾Article表

幸運的是,我們不必直接在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)

假設Tag為:

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)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM