Вы можете добавить настраиваемые поля в list_display
:
class CustomerAdmin(admin.ModelAdmin):
fields = ()
list_display = ('last_activity_planned_date',)
def last_activity_planned_date(self, obj):
latest_activity = obj.activities.order_by('-planned_execution_date').first()
if latest_activity and latest_activity.status_id == 2:
return latest_activity.planned_execution_date
else:
return None
Однако сделать этот столбец можно было бы сделать довольно сложным.Даже в сыром SQL это кажется сложным запросом.В Django 2.1 была добавлена поддержка выражений запросов в admin_order_field
, но я все еще не могу найти приличный SQL-запрос для такой сортировки.
Решение состоит в том, чтобы реплицировать эту информацию в поле Customer.last_activity_planned_date
(с помощью db_index=True
для повышения эффективности заказа).
Если вы можете позволить, чтобы эта информация обновлялась только периодически, вы можете настроить cronjob для ее обновления каждые 15 мин, 1 ч или 1 день (в соответствии с вашими потребностями иресурсы, необходимые для обновления).
Если вам нужна эта информация, чтобы она всегда была точной и без задержек, вам придется обновлять ее каждый раз при создании, обновлении или удалении записи Activities
.Существуют различные способы сделать это в зависимости от ваших потребностей, включая триггеры SQL и сигналы Django .Это работает довольно хорошо, но не на сто процентов уверен, поэтому даже если вы используете это решение, я бы посоветовал настроить ежедневный cronjob, чтобы убедиться, что все данные согласованы.