7 Stimmen

Django-Modelle nach einer Methode im Modell ordnen

Nehmen wir also an, ich habe Modelle wie dieses:

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

Dann ist dies der modelAdmin:

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

admin.site.register(Foo, FooAdmin)

Wenn ich die Verwaltungsseite aufrufe, wird eine Fehlermeldung ausgegeben, dass "latest_comment" nicht in app.Foo gefunden wurde. In list_display funktioniert es einwandfrei. Meine Frage ist also: Gibt es eine Möglichkeit, Modelle in list_display nach Methoden des Modells zu ordnen? Und wenn ja, wie?

3voto

Tisho Punkte 7860

Ich habe den Code nicht getestet, aber nur als eine Idee, um zu versuchen, dies mit Überschreiben der Queryset des ModelAdmin mit einer Annotate-Funktion, um über ein Feld von verwandten Feld sortieren zu implementieren:

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

1voto

Chris Pratt Punkte 219403

Ordnen ist eine Funktionalität auf SQL-Ebene, und Ihre Datenbank weiß nichts über die Methoden in Ihrem Modell.

Sie können jedoch auch nachträglich neu sortieren, indem Sie Ihre Abfrage in eine Liste umwandeln und dann etwas verwenden wie sorted . Siehe: http://wiki.python.org/moin/HowTo/Sorting/

Ich bezweifle allerdings, dass die sortierte Liste in der Verwaltung funktionieren wird. Ich könnte falsch sein, aber ich bin ziemlich sicher, dass Django es braucht, um ein Queryset zu bleiben.

0voto

Emmanuel Punkte 13207

En django doc könnten Sie vielleicht Ihre eigene definieren get_ordering Methode.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X