[英]Django: how to filter on subset of many-to-many field?
假設我有經典的Article
和Tag
模型。 如何過濾所有至少具有標簽A
和B
Article
模型。 因此,應包括帶有標簽A
, B
和C
的文章,但不包括帶有標簽A
和D
的文章。 謝謝!
這個問題可能很舊,但是我在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.