有没有人可以帮我解决以下问题:
我有以下型号:
class Post(models.Model):
title = models.CharField(max_length=50)
body = models.TextField()
tag = models.ManyToManyField('Tag', blank=True)
class Tag(models.Model):
name = models.CharField(max_length=50, unique=True)
非常简单。 现在我想创建queryset,它将为我提供包含所有帖子的所有帖子 给定标签。 例如。我的Post1带有标签:' tag1',Post2带有' tag2',Post3带有标签:' tag1'和' tag2'。我想只获得Post3。
我发现可以通过以下过滤器实现:
queryset = Post.object.filter(tag=1).filer(tag=2)
但是,如果我想检索传递大量标签的Post对象(会有很多链接过滤器),这是非常不可接受的。
如果存在更好的方法,请现在就告诉我。
提前谢谢。
答案 0 :(得分:1)
在一个查询中实现Sagars解决方案的方法
Post.objects.filter(
tag__in=tags
).annotate(
matched_tags=Count(tag)
).filter(
matched_tags=len(tags)
)
答案 1 :(得分:0)
要查询多个到多个字段,您可以使用以下方法:
queryset=Posts.objects.filter(tag__in=[tag1,tag2])
这将检索具有tag1和tag2的所有帖子对象。
答案 2 :(得分:0)
这个解决方案虽然不好,但会适用于您的情况,我希望您能得到理想的解决方案。
t = Tag.objects.filter(id__in=[1,2,3])
total_tags = len(t)
posts = list()
posts = Post.objects.all()
for p in posts:
post_tags = p.tag.filter(id__in=[1,2,3])
if total_tags = len(post_tags):
posts.append(p)
答案 3 :(得分:-1)
我认为你可以这样做:
queryset = Post.objects.filter(tag = Tag.objects.filter(id__in=(1,2)))