Django 过滤器查询集 __in 仅适用于列表中的项目
Django filter queryset __in for items only in list
型号:
class Tag(models.Model):
name = models.CharField(max_length=20)
class Post(models.Model):
tags = models.ManyToManyField(Tag)
title = models.CharField(max_length=20)
数据:
a_post=Post.objects.create(title='a')
ab_post=Post.objects.create(title='ab')
ac_post=Post.objects.create(title='ac')
a_tag=a_post.tags.create(name='a')
ab_post.tags.add(a_tag)
b_tag=ab_post.tags.create(name='b')
ac_post.tags.add(a_tag)
ac_post=ac_post.tags.create(name='c')
我想查询列表中只有标签的所有帖子。带有其他标签的帖子不应 returned。
代码如下:
Post.objects.filter(tags__name__only_in=['a','b']).all()
应该return[a_post,ab_post].
我已经阅读 this。链式过滤器无济于事。
有什么想法吗?
可以检查满足谓词的Tag
个数是否与标签总数相同:
from django.db.models import Count, Q
Post.objects.annotate(
ntags=Count('tags')
).filter(
ntags=Count('tags', <b>filter=Q(tags__name__in=['a', 'b'])</b>),
ntags__gt=0
)
因此,第一个过滤器检查相关标签的总数是否与名称为 'a'
或 'b'
的标签的数量相同。如果数字不同,那么我们就知道有一个名称不同的标签。
第二个过滤器检查标签的数量是否大于零,以排除根本没有标签的匹配项。
型号:
class Tag(models.Model):
name = models.CharField(max_length=20)
class Post(models.Model):
tags = models.ManyToManyField(Tag)
title = models.CharField(max_length=20)
数据:
a_post=Post.objects.create(title='a')
ab_post=Post.objects.create(title='ab')
ac_post=Post.objects.create(title='ac')
a_tag=a_post.tags.create(name='a')
ab_post.tags.add(a_tag)
b_tag=ab_post.tags.create(name='b')
ac_post.tags.add(a_tag)
ac_post=ac_post.tags.create(name='c')
我想查询列表中只有标签的所有帖子。带有其他标签的帖子不应 returned。 代码如下:
Post.objects.filter(tags__name__only_in=['a','b']).all()
应该return[a_post,ab_post].
我已经阅读 this。链式过滤器无济于事。 有什么想法吗?
可以检查满足谓词的Tag
个数是否与标签总数相同:
from django.db.models import Count, Q
Post.objects.annotate(
ntags=Count('tags')
).filter(
ntags=Count('tags', <b>filter=Q(tags__name__in=['a', 'b'])</b>),
ntags__gt=0
)
因此,第一个过滤器检查相关标签的总数是否与名称为 'a'
或 'b'
的标签的数量相同。如果数字不同,那么我们就知道有一个名称不同的标签。
第二个过滤器检查标签的数量是否大于零,以排除根本没有标签的匹配项。