Django ManytoMany过滤精确列表

And*_*unt 4 django django-models

假设我有一个id列表:c = ['1','2','3']

class Topic(Model):

 categories=ManyToManyField(Category)
Run Code Online (Sandbox Code Playgroud)

如何从c过滤具有精确且仅具有id的类别的主题?

Tod*_*dor 7

您需要调用列表中的.filter(categories=category_id)每个元素c.

c = [1, 2, 3]
topics = reduce(lambda qs, pk: qs.filter(categories=pk), c, Topic.objects.all())
Run Code Online (Sandbox Code Playgroud)

然后,如果您想要排除包含其他类别的主题(例如主题[1,2,3,4]),那么您需要.annotate.filter总计数.

c = [1, 2, 3]
initial_qs = Topic.objects.annotate(cnt=models.Count('categories')).filter(cnt=len(c))
topics = reduce(lambda qs, pk: qs.filter(categories=pk), c, initial_qs)
Run Code Online (Sandbox Code Playgroud)