# 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_orders
que tengan?
admin_order_field
La 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__count
get_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
Customer
que se incluye la cantidad de pedidos agregados y luego configuraradmin_order_field
ese 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