由ForeignKey分组并获得整个对象

时间:2016-04-07 15:51:33

标签: python django group-by foreign-keys

我正在制作对话系统

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列表

1 个答案:

答案 0 :(得分:0)

我会尝试这样的事情:

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

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

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

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