【问题标题】:Django Sort by backward foreign keyDjango 按反向外键排序
【发布时间】:2016-10-21 05:44:33
【问题描述】:

我目前有以下型号

class ChatRoom(models.Model):
      creator = models.ForeignKey('User') # points to the initial user

class Message(models.Model):
      room = models.ForeignKey('ChatRoom')
      text = models.CharField(max_length=500)
      date = models.DateTimeField()
      from = models.ForeignKey('User') # points to some user

对于登录我网站的任何给定用户,我想显示他们创建的聊天室列表,按他们最后一条消息(最新活动)的日期以及最后一条进入聊天室的消息的日期排序

类似

Your chat rooms
---------------
science - "hey guys, anyone know how to do calculus?" 5m
art     - "hey guys, I like art" 10m

我将如何在 django 中执行此查询?请记住,一个人可能有很多很多很多聊天室,因此我们不能只使用ChatRoom.objects.all() 加载所有聊天室并手动遍历它。

【问题讨论】:

    标签: django django-queryset


    【解决方案1】:

    您需要与上一条消息有额外的关系,否则您将无法通过它们订购。

    class ChatRoom(models.Model):
          creator = models.ForeignKey('User') # points to the initial user
          # you will need to set this in view or with signals.(don't forget to handle delete)
          last_message = models.ForignKey('Message')
    

    而且你可以做到这一点

    ChatRoom.objects.filter(...).order_by('last_message__date')
    

    【讨论】:

    • 那么你是说没有这个外键,除非我专门用all() 得到它们并手动遍历它,否则实际上就不可能按它们排序?
    • 也许有一种订购方式,但这不仅仅是订购零件。这也将帮助您呈现最后一条消息。因为没有这个。您将必须分别获取每个 CharRoom 的最后一条消息
    • 你对外键 last message 的想法是什么,而不是直接设置重复项,例如last_message_date & last_message_text
    • @Alan 这也是可能的。但 FK 是更通用的解决方案。因为,有一天你会想要添加last_message_usernamelast_message_tags 等。而且你设置这些数据的方式是一样的,所以我看不出非规范化的原因。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-09-12
    • 2019-12-01
    • 2016-07-01
    • 1970-01-01
    • 2021-06-12
    • 2011-08-10
    • 2013-02-24
    相关资源
    最近更新 更多