亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

Django Admin:如何按沒有數據庫字段的自定義list_display字段之一排序

Django Admin:如何按沒有數據庫字段的自定義list_display字段之一排序

ABOUTYOU 2019-12-09 15:12:22
# admin.pyclass CustomerAdmin(admin.ModelAdmin):      list_display = ('foo', 'number_of_orders')# models.pyclass 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()  如何根據客戶對客戶進行分類number_of_orders?admin_order_field屬性不能在這里使用,因為它需要一個數據庫字段進行排序。Django依賴底層數據庫執行排序,這有可能嗎?創建一個包含訂單數量的匯總字段似乎在這里是過大的。有趣的是:如果您在瀏覽器中手動更改url以在此列上進行排序-它將按預期工作!
查看完整描述

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'

這樣,您只需在管理界面內進行注釋。并非與您執行的每個查詢有關。


查看完整回答
反對 回復 2019-12-09
?
犯罪嫌疑人X

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子類化!


查看完整回答
反對 回復 2019-12-09
?
一只萌萌小番薯

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[...]


查看完整回答
反對 回復 2019-12-09
  • 3 回答
  • 0 關注
  • 1435 瀏覽

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號