# 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()
¿Cómo puedo clasificar a los Clientes, dependiendo de number_of_ordersque tengan?
admin_order_fieldLa propiedad no se puede usar aquí, ya que requiere un campo de base de datos para ordenar. ¿Es posible en absoluto, ya que Django se basa en la base de datos subyacente para realizar la clasificación? Crear un campo agregado para contener la cantidad de pedidos parece exagerado aquí.
Lo divertido: si cambia la URL a mano en el navegador para ordenar en esta columna, ¡funciona como se esperaba!
django
sorting
django-admin
mike_k
fuente
fuente

Respuestas:
Me encantó la solución de Greg a este problema, pero me gustaría señalar que puede hacer lo mismo directamente en el administrador:
De esta manera, solo realiza anotaciones dentro de la interfaz de administración. No con cada consulta que haces.
fuente
def number_of_orders(self, obj): return obj.order__countget_queryset()lugar dequeryset()?No lo he probado (me interesaría saber si funciona), pero ¿qué pasa con la definición de un administrador personalizado para el
Customerque se incluye la cantidad de pedidos agregados y luego configuraradmin_order_fieldese agregado, es decirEDITAR: Acabo de probar esta idea y funciona perfectamente, ¡no se requiere una subclase de administrador de django!
fuente
La única forma que se me ocurre es desnormalizar el campo. Es decir, cree un campo real que se actualice para mantenerse sincronizado con los campos de los que se deriva. Por lo general, hago esto anulando el guardado en el modelo con los campos desnormalizados o el modelo del que se deriva:
fuente