Как создать пользовательскую функцию модели db в Django, например, `Greatest`

У меня есть сценарий, в котором я хочу получить наибольшее значение с именем поля. Я могу получить наибольшее значение, используя функцию Greatest db, которую предоставляет django. но я не могу получить имя поля. например:

emps = Employee.objects.annotate(my_max_value=Greatest('date_time_field_1', 'date_time_field_1'))
for e in emps:
   print(e.my_max_value)

здесь я получу значение, используя e.my_max_value, но я не могу узнать имя поля этого значения

Если вы хотите, чтобы запрос к базе данных сообщил вам, какое из полей было больше, вам нужно добавить еще один аннотированный столбец, используя логику case/when для возврата имени одного поля или другого. (См. https://docs.djangoproject.com/en/4.0/ref/models/conditional-expressions/#when)

Если вы действительно не пытаетесь перегрузить работу с базой данных, будет гораздо проще выполнить работу по сравнению в Python.

Вам необходимо аннотировать условное выражение с помощью Case() и When().

from django.db.models import F, Case, When

emps = Employee.objects.annotate(
    greatest_field=Case(
        When(datetime_field_1__gt=F("datetime_field_2"), 
            then="datetime_field_1"),
        When(datetime_field_2__gt=F("datetime_field_1"), 
             then="datetime_field_2"),
        default="equal",
     )
)
for e in emps:
   print(e.greatest_field)
Вернуться на верх