django queryset排除外部表中引用的行



我的应用程序的一部分包括在新闻提要的顶部显示状态。这是我的状态模型

class Status(models.Model):
    user = models.ForeignKey(User)
    description = models.CharField(max_length = 600, blank = False)
    created_at = models.DateTimeField(auto_now_add = True, editable = False)
    image = models.ImageField(upload_to = 'images/statuspics/%Y/%m/%d', blank = True, null = True)
    utility = models.ForeignKey(Utility)
    numlikes = models.IntegerField(default = 0)
    class Meta:
        ordering = ["-created_at"]
        # Change plural form
        verbose_name_plural = "statuses"

然后我会得到回复,这是一种指示帖子是如何被回复的方式,以及宣布它的状态

class Response(models.Model):
    post = models.ForeignKey(Post, null = True, blank = True)
    status = models.ForeignKey(Status, null = True, blank = True)
    status_level = models.IntegerField(
        blank = True,
        choices = STATUS_CHOICES,
        default = 1)
    created_at = models.DateTimeField(auto_now_add = True, editable = False)

基本上,我想做的是只显示没有任何响应的状态。我认为我需要在视图中使用exclude(),但我不完全确定如何在这种情况下正确使用它。

你能试试Status.objects.exclude(response__isnull=True)吗?它基本上是在Response上对模型Status进行反向查找。

Django文档关于isull。

您也可以尝试这个(反向查找)

Status.objects.filter(response__isnull=False)

这不是Djannaut的做法,但您可以使用获得没有任何响应的状态列表

[s for s in Status.objects.all() if s not in [r.status for r in Response.objects.all()]]

最新更新