# 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()
Wie kann ich Kunden sortieren, je nachdem number_of_orders
, welche?
admin_order_field
Die Eigenschaft kann hier nicht verwendet werden, da zum Sortieren ein Datenbankfeld erforderlich ist. Ist es überhaupt möglich, dass Django sich beim Sortieren auf die zugrunde liegende Datenbank verlässt? Das Erstellen eines Aggregatfelds mit der Anzahl der Bestellungen scheint hier ein Overkill zu sein.
Das Schöne: Wenn Sie die URL im Browser von Hand ändern, um nach dieser Spalte zu sortieren, funktioniert sie wie erwartet!
django
sorting
django-admin
mike_k
quelle
quelle
Antworten:
Ich habe Gregs Lösung für dieses Problem geliebt, aber ich möchte darauf hinweisen, dass Sie dasselbe direkt im Administrator tun können:
Auf diese Weise kommentieren Sie nur innerhalb der Administrationsoberfläche. Nicht bei jeder Abfrage, die Sie durchführen.
quelle
def number_of_orders(self, obj): return obj.order__count
get_queryset()
stattdessen seinqueryset()
?Ich habe dies nicht getestet (ich würde gerne wissen, ob es funktioniert), aber was ist mit der Definition eines benutzerdefinierten Managers, für
Customer
den die Anzahl der aggregierten Aufträge enthalten ist, und der Einstellungadmin_order_field
auf dieses Aggregat, d. H.EDIT: Ich habe diese Idee gerade getestet und sie funktioniert perfekt - keine Unterklasse für Django-Administratoren erforderlich!
quelle
Ich kann mir nur vorstellen, das Feld zu denormalisieren. Das heißt - erstellen Sie ein reales Feld, das aktualisiert wird, um mit den Feldern synchron zu bleiben, von denen es abgeleitet ist. Normalerweise überschreibe ich das Speichern mit dem Modell mit den denormalisierten Feldern oder dem Modell, von dem es abgeleitet ist:
quelle