代码之家  ›  专栏  ›  技术社区  ›  Adam

Django Queryset F获取最后一个

  •  0
  • Adam  · 技术社区  · 6 年前

    Django 2.0.2 python 3.4版

    模特儿

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

    VIEW

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

    是否可以在f()中使用最后一个查询?

    1 回复  |  直到 6 年前
        1
  •  0
  •   icyfire    6 年前

    据我所知, 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')