2012-06-11 15 views
6

So, że mam modele tak:zamawiania modeli Django metodą w modelu

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() 

Wtedy to modelAdmin:

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

admin.site.register(Foo, FooAdmin) 

zgłasza błąd, kiedy idę do strona administracyjna mówiąca, że ​​'latest_comment' nie został znaleziony w app.Foo. Mając go w list_display działa dobrze. Moje pytanie brzmi: czy istnieje sposób porządkowania modeli w listing_display metodami modelu? A jeśli tak, to w jaki sposób?

Odpowiedz

3

nie testowałem ten kod, ale po prostu jako pomysł, aby spróbować zaimplementować to z przesłanianie queryset z ModelAdmin z funkcją opisywanie uporządkować nad polem z pokrewnej dziedzinie:

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

Działa to świetnie, tylko jeden problem. Nie ma sposobu, aby powrócić do tej kolejności po jej zmianie (na nazwisko, jeśli było tam pole). Ale dziękuję, powinno to przynajmniej chwilę potrwać. – uncleshelby

1

Zamawianie jest funkcją poziomu SQL, a twoja baza danych nie wie nic o metodach w twoim modelu.

Możesz jednak ponownie sortować po fakcie, konwertując zapytanie do listy, a następnie używając czegoś takiego jak sorted. Zobacz: http://wiki.python.org/moin/HowTo/Sorting/

Co jednak jest warte, wątpię, aby posortowana lista działała w administracji. Mogę się mylić, ale jestem prawie pewien, że Django potrzebuje go, by pozostać zestawem zapytań.

0

Od django doc można określić własną metodę get_ordering.

+0

Że nie robi nie rozwiązuje problemu. 'get_ordering' pozwala tylko dynamicznie określać kolejność; * nadal * musisz używać rzeczywistych pól DB, a nie metody na modelu. –

+0

Dobra uwaga, w rzeczy samej nie pozwala to na dostosowanie zamówienia. – Emmanuel

Powiązane problemy