# 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()
Jak mogę sortować klientów, w zależności od number_of_orders
tego, czy mają?
admin_order_field
nie można tutaj użyć właściwości, ponieważ wymaga ona pola bazy danych do sortowania. Czy to w ogóle możliwe, skoro Django polega na bazowej bazie danych do wykonywania sortowania? Tworzenie pola zbiorczego zawierającego liczbę zamówień wydaje się tutaj przesadą.
Fajna rzecz: jeśli ręcznie zmienisz adres URL w przeglądarce, aby posortować według tej kolumny - działa zgodnie z oczekiwaniami!
django
sorting
django-admin
mike_k
źródło
źródło
Odpowiedzi:
Spodobało mi się rozwiązanie tego problemu Grega, ale chciałbym zaznaczyć, że możesz zrobić to samo bezpośrednio w panelu administracyjnym:
W ten sposób możesz dodawać adnotacje tylko w interfejsie administratora. Nie przy każdym zadanym zapytaniu.
źródło
def number_of_orders(self, obj): return obj.order__count
get_queryset()
zamiast tegoqueryset()
?Nie testowałem tego (chciałbym wiedzieć, czy to działa), ale co ze zdefiniowaniem niestandardowego menedżera, dla
Customer
którego liczba zagregowanych zamówień, a następnie ustawienieadmin_order_field
tego agregatu, tj.EDYCJA: Właśnie przetestowałem ten pomysł i działa doskonale - nie jest wymagana żadna podklasa administratora django!
źródło
Jedyny sposób, jaki przychodzi mi do głowy, to denormalizacja tego pola. To znaczy - utwórz prawdziwe pole, które zostanie zaktualizowane, aby pozostać zsynchronizowane z polami, z których pochodzi. Zwykle robię to przez nadpisanie zapisu na modelu ze zdenormalizowanymi polami lub modelem, z którego pochodzi:
źródło