【问题标题】:Django queryset with "isnull" argument returning duplicates带有“isnull”参数的Django查询集返回重复项
【发布时间】:2011-08-20 22:08:03
【问题描述】:

我只想退回没有关联图片的商品。我的关系是这样的:

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 张照片,因此它在查询集中返回了 5 张副本。我查看了文档,这有点棘手。我最终使用了 distinct(),但我认为我可以让它立即工作。

谢谢

【问题讨论】:

    标签: sql django django-models django-queryset


    【解决方案1】:

    我不确定您所说的“但我认为我可以立即使其工作”是什么意思,但是使用 distinct() 或 order_by() 应该可以解决您的问题。

    【讨论】:

      【解决方案2】:

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

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

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

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

      我不确定您为什么在查询中查询 photo__photo__isnull -- 我的回答假设您应该使用 photo__isnull

      【讨论】:

      • 感谢阿拉斯代尔。我很困惑为什么要返回重复项,但如果就是这样,我将使用 distinct()
      猜你喜欢
      • 2022-01-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-02-04
      • 2019-03-15
      • 2016-05-08
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多