根据新近度从Django queryset中排除对象

时间:2016-04-17 08:40:09

标签: django performance django-models django-queryset

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

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)])

如何查询至少有一个或多个Links的所有publicreply,其次是publicreply self.request.user }}?我感觉如下:

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

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

1 个答案:

答案 0 :(得分:1)

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

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)