【问题标题】:How annotate the Max value of two fields in a Django QuerySet如何在 Django QuerySet 中注释两个字段的最大值
【发布时间】:2018-02-22 21:48:32
【问题描述】:

我有一个模型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,如果有帮助的话。

【问题讨论】:

    标签: python django postgresql orm


    【解决方案1】:

    感谢罗伯特的回答,我找到了Greatest class of 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')
    

    【讨论】:

    • 官方文档中提到GREATEST的实现依赖于SQL后端。我发现“NULL”的处理让我感到困惑,不得不为我的用例编写额外的选择。
    【解决方案2】:

    您好,您可以使用 django query extra 功能

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

    这将返回最大值两个字段

    【讨论】:

      猜你喜欢
      • 2011-11-10
      • 1970-01-01
      • 1970-01-01
      • 2010-10-22
      • 1970-01-01
      • 2017-08-29
      • 2019-05-31
      • 2019-08-03
      • 2023-03-30
      相关资源
      最近更新 更多