根据新近度从 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_replies
和link.latest_reply
。
查询将是:
Link.objects.filter(number_of_replies__gte=1)\
.exclude(latest_reply__user=request.user)
我有一个类似 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_replies
和link.latest_reply
。
查询将是:
Link.objects.filter(number_of_replies__gte=1)\
.exclude(latest_reply__user=request.user)