如何在Django QuerySet中注释两个字段的Max值

时间:2017-09-14 03:39:26

标签: python django postgresql orm

我有一个模型Client,我如何注释然后排序,它的两个字段的最大值:

from django.db import models

class Client(models.Model):
    uploaded_photo_at = models.DateTimeField()
    uploaded_document_at = models.DateTimeField()

以下内容:

Client.objects.annotate(
    latest_activity_at=Max('uploaded_photo_at', 'uploaded_document_at', output_field=DateTimeField())
).order_by('latest_activity_at')

引发此错误:

django.db.utils.ProgrammingError: function max(timestamp with time zone, timestamp with time zone) does not exist
LINE 1: ...oto_at", "clients_client"."uploaded_document_at", MAX("clien...
                                                             ^
HINT:  No function matches the given name and argument types. You might need to add explicit type casts.

我正在使用Posgresql和Django 1.11,如果有帮助的话。

2 个答案:

答案 0 :(得分:8)

感谢Robert的回答,我能够找到Greatest类的Django。

以下作品:

from django.db.models.functions import Greatest

Client.objects.annotate(
    latest_activity_at=Greatest('uploaded_photo_at', 'uploaded_document_at')
).order_by('latest_activity_at')

答案 1 :(得分:2)

您好,您可以使用django 查询额外功能

qs = Client.objects.extra(select={'output_field': 
                                 'GREATEST(uploaded_photo_at, uploaded_document_at)'})
                   .order_by('latest_activity_at')

这将返回最大值两个文件