Python 在Django中查询多个给我重复结果

Python 在Django中查询多个给我重复结果,python,django,python-2.7,django-1.9,Python,Django,Python 2.7,Django 1.9,我有两种型号 class Tag(models.Model): key = models.CharField(max_length=200) class Post(models.Model): name = models.CharField(max_length=200) tags = models.ManyToManyField(Tag) 我试图用标签列表过滤掉帖子。比如标签heat和warm。我将在api函数中获得标记列表(['heat','warm'])。我想过滤所有

我有两种型号

class Tag(models.Model):
   key = models.CharField(max_length=200)

class Post(models.Model):
   name = models.CharField(max_length=200)
   tags = models.ManyToManyField(Tag)

我试图用标签列表过滤掉帖子。比如标签
heat
warm
。我将在api函数中获得标记列表(
['heat','warm']
)。我想过滤所有带有标签的Post数据,这些标签的键在列表中。我尝试了许多类型,但没有得到正确的输出。有没有一种方法可以在单个查询中执行此操作?

所有使用此标记键的帖子都等于

Post.objects.filter(tags__key_in=['heat', 'warm']) 
添加不同的以避免重复:

Post.objects.filter(tags__key_in=['heat', 'warm']).distinct()
虽然对于许多用例来说都是正确且完美的,但值得注意的是,在SQL级别上,
DISTINCT
可能会对性能产生影响,特别是如果您希望查询匹配大部分数据(取决于数据库和表的大小;有关更多详细信息,请参见和)

另一个稍微详细一点的选项可以避免这个陷阱,它使用
模型和
子查询(在django 1.11中介绍)。根据OPs代码:

类标记(models.Model):
key=models.CharField(最大长度=200)
班级职务(models.Model):
name=models.CharField(最大长度=200)
tags=models.ManyToManyField(Tag,通过class='Tagging')
类标记(models.Model):
tag=models.ForeignKey(tag,on_delete=models.CASCADE)
post=models.ForeignKey(post,on_delete=models.CASCADE)
以及相应的查询:

tags=Tagging.objects.filter(tag\uuuu key\uuuu in=['heat','warm'])
Post.objects.filter(pk\uu-in=models.Subquery(tags.values('Post\uu-pk'))

使用
.explain(analyze=True)
(在django 2.1中介绍)将有助于您做出明智的决策。

您是否可以显示除此之外的其他输出?我不知道你需要什么。