2010-04-15 16 views
5

Tengo un campo list_display personalizado que es responsable de una columna de números enteros en una de mis páginas de administración.Cómo permitir la clasificación en el administrador de Django mediante un campo list_display personalizado, que no tiene un campo DB ni anotables

Necesito permitir que los miembros del personal clasifiquen según él.

Hay una solución para lograr que si el entero representa un recuento/promedio/etc. de algún campo de base de datos, que no es el caso para mí.

[la solución para ese caso está aquí: Django admin: how to sort by one of the custom list_display fields that has no database field ]

Alguna idea de cómo puedo lograr esta clasificación sin llegar a crear y mantener un campo de base de datos para los valores?

+0

http://stackoverflow.com/a/3351431/17498 –

Respuesta

5

La clasificación se realiza en el motor DB (en una cláusula order by), por lo que no creo que pueda lograr lo que desea a menos que materialice un campo en el modelo. Los estados calculados no son ordenables en este punto (al menos no en la interfaz de administración, si usabas tu propia interfaz, podrías usar extra).

Si el problema era el filtrado, podría escribir un FilterSpec personalizado (que no parece estar documentado en ningún lugar, pero SO tiene un good example).

Pero para ordenar en el administrador su única opción es un campo materializado, me temo.

Editar:

Hmmm ...

Usted podría intentar algo. It is possible (aunque no creo que esté documentado en ningún lugar formalmente) para cambiar el conjunto de consulta utilizado por un ModelAdmin. Si el campo calculado es lo suficientemente simple para ser integrado en la propia consulta que podría hacer algo como:

class BlahAdmin(admin.ModelAdmin): 
    ... Whatever definitions ... 

    def queryset(self, request): 
     return Blah.objects.extra(select={'computed': "count(field_x)"}) 

Esto podría funcionar. Sin embargo, no ha sido probado.

+0

si su objeto es Proxied, debe agregar un orden a la clase de metadatos proxy: ordering = ['computed',], de lo contrario, usará ' id 'por alguna razón. – fastmultiplication

Cuestiones relacionadas