django queryset F得到最后一个

时间:2018-06-18 03:00:35

标签: django django-queryset

django 2.0.2 python 3.4

models.py

Post(models.Model):
   Id = pk
   content = text

Reply(models.Model):
   Id = pk
   PostId = Fk(Post)
   content = text

view.py

Post.objects.all().annotate(lastreply=F("Reply__content__last"))

可以使用F()中的最后一个查询吗?

1 个答案:

答案 0 :(得分:0)

据我所知,latest不能与F()一起使用。

一种可能的解决方案是在reply

中包含时间戳
Post(models.Model):
   Id = pk
   content = text

Reply(models.Model):
   Id = pk
   PostId = Fk(Post)
   content = text
   timestamp = DateTime(auto)

然后,您可以使用此格式的查询来获取每个帖子的最新回复。 Reply.objects.annotate(max_time=Max('Post__Reply__timestamp')).filter(timestamp=F('max_time'))

请注意,这对于大量记录来说非常耗时。 如果您使用的是Postgres数据库,则可以使用distinct()

Reply.objects.order_by('Post__Id','-timestamp').distinct('Post__Id')