2012-06-11 14 views
6

Por lo tanto, decir que tengo los modelos de la siguiente manera:pedidos modelos de Django por un método en el modelo

class Foo(Model): 
    name = CharField(max_length=200) 
    def latest_comment(self): 
     try: 
      object = self.comment_set.latest() 
      if object: 
       return object.when_posted.date() 
     except: 
      return "" 

class Comment(Model): 
    when_posted = DateTimeField() 
    text = TextField() 

entonces este es el modelAdmin:

class FooAdmin(ModelAdmin): 
    list_display = ['name', 'latest_comment'] 
    ordering = ['latest_comment'] 

admin.site.register(Foo, FooAdmin) 

Se genera un error cuando voy a la sitio de administración diciendo que 'latest_comment' no se encontró en la aplicación. Tenerlo en list_display funciona bien. Entonces, mi pregunta es: ¿hay alguna manera de ordenar modelos en list_display por métodos del modelo? Y si es así, ¿cómo?

Respuesta

3

No he probado el código, pero sólo como una idea para tratar de implementar esto con anulando el conjunto de consultas de la ModelAdmin con una función Anotar para resolver sobre un campo de campo relacionado:

class FooAdmin(admin.ModelAdmin): 
    def queryset(self, request): 
     qs = super(FooAdmin, self).queryset(request) 

     return qs.distinct() \ 
     .annotate(date_of_last_comment=Max('comment__date')) \ 
     .order_by('-date_of_last_comment') 
+0

Esto funciona genial, solo un problema. No hay forma de volver a hacer ese pedido una vez que ha sido cambiado (a un nombre, si había un campo para eso). Pero gracias, esto debería funcionar por un tiempo al menos. – uncleshelby

1

El pedido es una funcionalidad de nivel SQL y su base de datos no sabe nada sobre los métodos en su modelo.

Sin embargo, puede volver a ordenar después de convertir la consulta en una lista y luego usar algo como sorted. Ver: http://wiki.python.org/moin/HowTo/Sorting/

Por lo que vale, dudo que la lista ordenada funcione en el administrador. Podría estar equivocado, pero estoy bastante seguro de que Django necesita que se quede un queryset.

0

De django doc, podría definir su propio método get_ordering.

+0

Eso no resolver el problema 'get_ordering' solo le permite especificar dinámicamente el orden; usted * todavía * debe usar campos DB reales, no un método en el modelo. –

+0

Una buena observación, de hecho no le permite personalizar el pedido. – Emmanuel

Cuestiones relacionadas