3 回答

TA貢獻1804條經驗 獲得超7個贊
我喜歡Greg解決此問題的方法,但我想指出,您可以直接在管理員中執行相同的操作:
from django.db import models
class CustomerAdmin(admin.ModelAdmin):
list_display = ('number_of_orders',)
def get_queryset(self, request):
# def queryset(self, request): # For Django <1.6
qs = super(CustomerAdmin, self).get_queryset(request)
# qs = super(CustomerAdmin, self).queryset(request) # For Django <1.6
qs = qs.annotate(models.Count('order'))
return qs
def number_of_orders(self, obj):
return obj.order__count
number_of_orders.admin_order_field = 'order__count'
這樣,您只需在管理界面內進行注釋。并非與您執行的每個查詢有關。

TA貢獻2080條經驗 獲得超4個贊
我尚未對此進行測試(我想知道它是否有效),但是如何定義一個自定義管理器,Customer其中包括匯總的訂單數,然后設置admin_order_field為該匯總,即
from django.db import models
class CustomerManager(models.Manager):
def get_query_set(self):
return super(CustomerManager, self).get_query_set().annotate(models.Count('order'))
class Customer(models.Model):
foo = models.CharField[...]
objects = CustomerManager()
def number_of_orders(self):
return u'%s' % Order.objects.filter(customer=self).count()
number_of_orders.admin_order_field = 'order__count'
編輯:我剛剛測試了這個想法,它完美地工作-不需要django admin子類化!

TA貢獻1795條經驗 獲得超7個贊
我能想到的唯一方法是對字段進行非規范化。也就是說-創建一個實際字段,該字段將進行更新以與它所源自的字段保持同步。我通常通過覆蓋帶有非規范化字段的模型或其衍生模型來保存:
# models.py
class Order(models.Model):
bar = models.CharField[...]
customer = models.ForeignKey(Customer)
def save(self):
super(Order, self).save()
self.customer.number_of_orders = Order.objects.filter(customer=self.customer).count()
self.customer.save()
class Customer(models.Model):
foo = models.CharField[...]
number_of_orders = models.IntegerField[...]
- 3 回答
- 0 關注
- 1435 瀏覽
添加回答
舉報