用于检索包含所有多对多关系的对象的Queryset

时间:2017-06-10 09:27:00

标签: django django-models django-queryset

有没有人可以帮我解决以下问题:

我有以下型号:

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对象(会有很多链接过滤器),这是非常不可接受的。

如果存在更好的方法,请现在就告诉我。

提前谢谢。

4 个答案:

答案 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)))