根据新近度从 Django 查询集中排除对象

Excluding objects from Django queryset based on recency

我有一个类似 reddit 的 Django 应用程序,用户可以在其中 post 有趣的 url(链接),然后在它们下面公开发表评论。表示这一点的两个数据模型是:

class Link(models.Model):
    description = models.TextField(validators=[MaxLengthValidator(500)])
    submitter = models.ForeignKey(User)
    submitted_on = models.DateTimeField(auto_now_add=True)

class Publicreply(models.Model):
    submitted_by = models.ForeignKey(User)
    answer_to = models.ForeignKey(Link)
    submitted_on = models.DateTimeField(auto_now_add=True)
    description = models.TextField(validators=[MaxLengthValidator(250)])

如何查询至少有 1 个或多个 publicreply 的所有 Links,其次,最新的 publicreply 而不是 self.request.user?我感觉到类似以下内容:

Link.objects.filter(publicreply__isnull=False).exclude(**something here**)

请指教!性能也是关键,越简单越好!

为了性能和简单性,您可以缓存回复数量和最新回复:

class Link(models.Model):
    ...
    number_of_replies = models.PositiveIntegerField(default=0)
    latest_reply = models.ForeignKey('myapp.Publicreply', related_name='+', blank=True, null=True, on_delete=models.SET_NULL)

输入回复后,更新相应的link.number_of_replieslink.latest_reply

查询将是:

Link.objects.filter(number_of_replies__gte=1)\
            .exclude(latest_reply__user=request.user)