第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

為了賬號(hào)安全,請(qǐng)及時(shí)綁定郵箱和手機(jī)立即綁定
已解決430363個(gè)問題,去搜搜看,總會(huì)有你想問的

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

Django Admin:如何按沒有數(shù)據(jù)庫字段的自定義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()  如何根據(jù)客戶對(duì)客戶進(jìn)行分類number_of_orders?admin_order_field屬性不能在這里使用,因?yàn)樗枰粋€(gè)數(shù)據(jù)庫字段進(jìn)行排序。Django依賴底層數(shù)據(jù)庫執(zhí)行排序,這有可能嗎?創(chuàng)建一個(gè)包含訂單數(shù)量的匯總字段似乎在這里是過大的。有趣的是:如果您在瀏覽器中手動(dòng)更改url以在此列上進(jìn)行排序-它將按預(yù)期工作!
查看完整描述

3 回答

?
三國紛爭

TA貢獻(xiàn)1804條經(jīng)驗(yàn) 獲得超7個(gè)贊

我喜歡Greg解決此問題的方法,但我想指出,您可以直接在管理員中執(zhí)行相同的操作:


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'

這樣,您只需在管理界面內(nèi)進(jìn)行注釋。并非與您執(zhí)行的每個(gè)查詢有關(guān)。


查看完整回答
反對(duì) 回復(fù) 2019-12-09
?
犯罪嫌疑人X

TA貢獻(xiàn)2080條經(jīng)驗(yàn) 獲得超4個(gè)贊

我尚未對(duì)此進(jìn)行測試(我想知道它是否有效),但是如何定義一個(gè)自定義管理器,Customer其中包括匯總的訂單數(shù),然后設(shè)置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'

編輯:我剛剛測試了這個(gè)想法,它完美地工作-不需要django admin子類化!


查看完整回答
反對(duì) 回復(fù) 2019-12-09
?
一只萌萌小番薯

TA貢獻(xiàn)1795條經(jīng)驗(yàn) 獲得超7個(gè)贊

我能想到的唯一方法是對(duì)字段進(jìn)行非規(guī)范化。也就是說-創(chuàng)建一個(gè)實(shí)際字段,該字段將進(jìn)行更新以與它所源自的字段保持同步。我通常通過覆蓋帶有非規(guī)范化字段的模型或其衍生模型來保存:


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


查看完整回答
反對(duì) 回復(fù) 2019-12-09
  • 3 回答
  • 0 關(guān)注
  • 1449 瀏覽

添加回答

舉報(bào)

0/150
提交
取消
微信客服

購課補(bǔ)貼
聯(lián)系客服咨詢優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動(dòng)學(xué)習(xí)伙伴

公眾號(hào)

掃描二維碼
關(guān)注慕課網(wǎng)微信公眾號(hào)