django queryset排除外表

时间:2016-04-19 21:09:36

标签: python django 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(),但在这种情况下,我并不完全确定如何正确使用它。

3 个答案:

答案 0 :(得分:1)

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

Django doc about isnull

答案 1 :(得分:0)

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

Status.objects.filter(response__isnull=False)

答案 2 :(得分:-1)

这不是Djangonaut会这样做的方式,但你可以获得状态列表没有任何回应

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