Как создать пользовательскую функцию модели 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)