带有“isnull”参数的Django queryset返回重复项

时间:2011-05-07 21:58:04

标签: sql django django-models django-queryset

我想只返回没有关联图像的项目。我的关系是这样的:

class Post(models.Model):
     ....fields


class Photo(models.Model):
    post=models.ForeignKey(Post,blank=True,null=True)
    photo=models.FileField(upload_to="pics")    


    def __unicode__(self):
        return str(self.post)

我将以下查询放在一起以返回Photo不为空的Post实例:

    posts=Post.objects.filter(photo__photo__isnull=False)

问题在于,它根据与Post实例相关的Photo实例的数量返回每个Post实例的多个副本。换句话说,一个帖子有5张照片,因此在查询集中返回五个副本。我查看了文档,这有点棘手。我最终使用distinct(),但我认为我可以立即使用它。

由于

2 个答案:

答案 0 :(得分:8)

要返回没有关联照片的帖子,请使用以下查询:

posts=Post.objects.filter(photo__isnull=True)

您在问题的后面使用isnull=False。正如您所说,生成的查询集将为每个附加到它的照片返回一次。要仅在查询集中包含每个帖子一次,请使用distinct。

posts=Post.objects.filter(photo__isnull=False).distinct()

我不确定您在查询中查询photo__photo__isnull的原因 - 我的回答是假设您应该使用photo__isnull

答案 1 :(得分:1)

我不确定你的意思是“但我认为我可以让它立即起作用”,但使用distinct()或order_by()应该是你问题的解决方案。