# admin.py
class CustomerAdmin(admin.ModelAdmin):
list_display = ('foo', 'number_of_orders')
# models.py
class Order(models.Model):
bar = models.CharField[...]
customer = models.ForeignKey(Customer)
class Customer(models.Model):
foo = models.CharField[...]
def number_of_orders(self):
return u'%s' % Order.objects.filter(customer=self).count()
Как я могу отсортировать клиентов в зависимости от number_of_orders
их наличия?
admin_order_field
Свойство здесь использовать нельзя, так как для сортировки требуется поле базы данных. Возможно ли это вообще, поскольку Django полагается на базовую БД для выполнения сортировки? Создание агрегированного поля, содержащего количество заказов, здесь кажется излишним.
Самое интересное: если вы вручную измените URL-адрес в браузере для сортировки по этому столбцу - все будет работать, как ожидалось!
django
sorting
django-admin
mike_k
источник
источник
Ответы:
Мне понравилось решение этой проблемы Грегом, но я хотел бы отметить, что вы можете сделать то же самое прямо в админке:
Таким образом, вы делаете аннотации только в интерфейсе администратора. Не с каждым вашим запросом.
источник
def number_of_orders(self, obj): return obj.order__count
get_queryset()
вместоqueryset()
?Я не тестировал это (мне было бы интересно узнать, работает ли он), но как насчет определения настраиваемого менеджера, для
Customer
которого включается количество агрегированных заказов, а затем установкиadmin_order_field
этого агрегата, т.е.РЕДАКТИРОВАТЬ: Я только что протестировал эту идею, и она отлично работает - подкласс администратора django не требуется!
источник
Единственный способ, который я могу придумать, - это денормализовать поле. То есть - создать реальное поле, которое будет обновляться для синхронизации с полями, из которых оно получено. Я обычно делаю это, отменяя save на модели с денормализованными полями или моделью, из которой она получена:
источник