我正在制作对话系统
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列表
答案 0 :(得分:0)
我会尝试这样的事情:
DialogMessage.objects.annotate(last_date=Max('create_date'))
基本上,您应该在values()
中指定您想要的所有参数。您只在注释中指定了dialog_id
和last_date
。
如果您需要使用values()
,请使用:
objects.values('dialog_id', 'dialog__create_date', 'dialog__author', ...)
(指定您需要通过双下划线__
分隔它们的外键参数)
我还认为在两个模型中都有author
是糟糕的设计。