# 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()
Bagaimana saya bisa menyortir Pelanggan, tergantung pada yang number_of_orders
mereka miliki?
admin_order_field
properti tidak dapat digunakan di sini, karena memerlukan bidang database untuk mengurutkan. Apakah mungkin sama sekali, karena Django mengandalkan DB yang mendasari untuk melakukan penyortiran? Membuat kolom agregat yang berisi jumlah pesanan tampaknya berlebihan di sini.
Hal yang menyenangkan: jika Anda mengubah url dengan tangan di browser untuk mengurutkan kolom ini - berfungsi seperti yang diharapkan!
django
sorting
django-admin
mike_k
sumber
sumber
Jawaban:
Saya menyukai solusi Greg untuk masalah ini, tetapi saya ingin menunjukkan bahwa Anda dapat melakukan hal yang sama langsung di admin:
Dengan cara ini Anda hanya membuat anotasi di dalam antarmuka admin. Tidak dengan setiap pertanyaan yang Anda lakukan.
sumber
def number_of_orders(self, obj): return obj.order__count
get_queryset()
bukanqueryset()
?Saya belum mengujinya (saya akan tertarik untuk mengetahui apakah ini berfungsi) tetapi bagaimana dengan menentukan pengelola khusus
Customer
yang menyertakan jumlah pesanan yang dikumpulkan, dan kemudian menetapkanadmin_order_field
ke agregat itu, yaituEDIT: Saya baru saja menguji ide ini dan bekerja dengan sempurna - tidak diperlukan subclass admin django!
sumber
Satu-satunya cara yang dapat saya pikirkan adalah dengan mendenormalisasi lapangan. Yaitu - buat bidang nyata yang diperbarui agar tetap sinkron dengan bidang asalnya. Saya biasanya melakukan ini dengan mengganti save on eith model dengan bidang yang dinormalisasi atau model yang berasal dari:
sumber