【问题标题】:Group by ForeignKey and get whole object按 ForeignKey 分组并获取整个对象
【发布时间】:2016-04-07 15:51:32
【问题描述】:

我正在制作对话系统

class Dialog(models.Model):
    create_date = models.DateTimeField(auto_now_add=True, blank=False, null=False)
    author = models.ForeignKey(User, related_name="author_customer", blank=False, null=False)
    interlocutor = models.ForeignKey(User, related_name="interlocutor_customer", blank=False, null=False)
    archive_date = models.DateTimeField(blank=True, null=True)
    last_view_date = models.DateTimeField(blank=True, null=True)

class DialogMessage(models.Model):
    create_date = models.DateTimeField(auto_now_add=True, blank=False, null=False)
    dialog = models.ForeignKey(Dialog, blank=False, null=False)
    author = models.ForeignKey(User, blank=False, null=False)
    message = models.TextField(blank=False, null=False)
    attachment = models.FileField(upload_to='dialogs', blank=True, null=True)

我想通过每个对话框的创建日期来获取最后一条消息

* Dialog1
    Last Message
* Dialog2
    Last Message    

我试着让它变成这样

DialogMessage.objects.values('dialog_id').annotate(last_date=Max('create_date'))

但它给了我

[{'dialog_id': 1, 'last_date': datetime.datetime(2016, 4, 6, 3, 15, 56, 267626, tzinfo=<UTC>)}, {'dialog_id': 2, 'last_date': datetime.datetime(2016, 4, 7, 13, 24, 33, 856453, tzinfo=<UTC>)}, {'dialog_id': 3, 'last_date': datetime.datetime(2016, 4, 7, 13, 25, 14, 948088, tzinfo=<UTC>)}]

我怎样才能不仅获得 last_date,而且获得整个 DialogMessage

最后我想要每个对话框的最后一个 DialogMessage 列表

【问题讨论】:

    标签: python django group-by foreign-keys


    【解决方案1】:

    我会尝试这样的:

    DialogMessage.objects.annotate(last_date=Max('create_date'))
    

    基本上你应该在values() 中指定你想要的所有参数。您只在注释中指定了dialog_idlast_date

    如果需要使用values(),请使用:
    objects.values('dialog_id', 'dialog__create_date', 'dialog__author', ...) (要指定外键的参数,你需要用双下划线__分隔它们)

    我还认为在两个模型中都有author 是不好的设计。

    【讨论】:

      猜你喜欢
      • 2013-12-23
      • 2017-07-24
      • 1970-01-01
      • 1970-01-01
      • 2017-09-29
      • 2021-06-08
      • 1970-01-01
      • 2020-11-09
      • 2012-07-23
      相关资源
      最近更新 更多