首页 > 解决方案 > 在 Django 查询中使用 max()

问题描述

有没有办法让这个查询与 Django 一起工作?

stage = Task.objects.filter(id = input_stage.id)\
            .update(start_date = max(data.get('start_date'), F('start_date')),
                    finish_date = max(data.get('finish_date'), F('finish_date')))

现在我得到一个错误:

TypeError: '>' not supported between instances of 'F' and 'datetime.date'

标签: pythondjangodjango-queryset

解决方案


数据库中的max两个字段之间在 Django 中是Greatest[Django-doc],所以查询应该是这样的:

from django.db.models import F, Value
from django.db.models.functions import Greatest

Task.objects.filter(
    id=input_stage.id
).update(
    start_date=Greatest(Value(data.get('start_date')), F('start_date')),
    finish_date=Greatest(Value(data.get('finish_date')), F('finish_date'))
)

您可能还想将data.get('start_date')等转换为date对象。

请注意.update(..)[django-doc]不返回 a ,但是QuerySet

(...) 并返回匹配的行数(如果某些行已经具有新值,则可能不等于更新的行数)。


推荐阅读