Django之 ArrayAgg與Admin技巧學(xué)習(xí)
Django Admin 技巧
有這樣一個(gè)需求, Django 后臺(tái) admin 有一個(gè) select 字段, 其備選項(xiàng)是某個(gè)系統(tǒng)路徑下的文件名, 因此下拉列表的備選項(xiàng)是動(dòng)態(tài)的.
而常規(guī)的 select 聲明方式如下, 其備選項(xiàng) choices 是靜態(tài)的. 如果目標(biāo)路徑的文件發(fā)生變動(dòng), 必須重啟 django 才能獲得更新后的下拉列表.
name = models.CharField(max_length=64, choices = (('0','file1'),('0','file1')))
一個(gè)自然思路就是, 重載admin的 formfield_for_choice_field()
, 在函數(shù)內(nèi)部調(diào)用下拉列表獲取方法.
但問題是, 一旦選擇的值不在上面聲明的 choices
中, 表單驗(yàn)證就會(huì)失敗.
正確的做法是取消 choices 約束, 將字段變成純字符串型.
name = models.CharField(max_length=64)
這時(shí)候, admin 對(duì)name的 widget 會(huì)由 select 變?yōu)?input, 這不是我們想要的. 所以需要手動(dòng)指定:
class RouteForm(forms.ModelForm): class Meta: widgets = { 'name': forms.Select(), } class RouteAdmin(TreeAdmin): form = RouteForm def formfield_for_dbfield(self, db_field, request, **kwargs): if db_field.name == 'name': choices = TextChoices( 'RouteName', get_files() ) kwargs['widget'].choices = choices.choices return super().formfield_for_dbfield(db_field, request, **kwargs)
這時(shí)候, 需要重載的函數(shù)就變?yōu)榱?formfield_for_dbfield()
, 按照上述方式構(gòu)造的admin,就能夠?qū)崿F(xiàn)業(yè)務(wù)需求.
Django 技巧之 ArrayAgg
PostgreSQL 提供了聚合類 ArrayAgg, 能夠方便的完成列表的聚合.
Returns a list of values, including nulls, concatenated into an array, or default if there are no values.
例如
class Item(models.Model): name = models.CharField(max_length=20) class A(models.Model): name = models.CharField(max_length=20) items = models.ManyToManyField(to=Item)
打算將A模型序列化成以下形式
[ { "id": 1, "name": "名稱1", "item_list": [ 410,415,416] }, { "id": 2, "name": "名稱2", "item_list": [ 411,415,416] }, ]
也就是說(shuō), 將 ManyToManyField 這種外鍵直接序列化成列表形式. 這時(shí)候可以采用下述方式
A.objects.annotate( item_list=ArrayAgg('items',distinct=True)).values( 'id', 'name', 'item_list')
非常簡(jiǎn)潔優(yōu)雅,且這是數(shù)據(jù)庫(kù)底層支持的函數(shù), 所有運(yùn)行效率也非常高.
可以看出, Django項(xiàng)目采用 PostgreSQL 作為數(shù)據(jù)庫(kù)還是非常有價(jià)值的.
以上就是Django之 ArrayAgg與Admin技巧學(xué)習(xí)的詳細(xì)內(nèi)容,更多關(guān)于Django技巧ArrayAgg Admin的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
Python實(shí)現(xiàn)的遠(yuǎn)程文件自動(dòng)打包并下載功能示例
這篇文章主要介紹了Python實(shí)現(xiàn)的遠(yuǎn)程文件自動(dòng)打包并下載功能,結(jié)合實(shí)例形式分析了Python使用spawn()方法執(zhí)行ssh、scp 命令實(shí)現(xiàn)遠(yuǎn)程文件的相關(guān)操作技巧,需要的朋友可以參考下2019-07-07為了順利買到演唱會(huì)的票用Python制作了自動(dòng)搶票的腳本
大麥網(wǎng),是中國(guó)綜合類現(xiàn)場(chǎng)娛樂票務(wù)營(yíng)銷平臺(tái),業(yè)務(wù)覆蓋演唱會(huì)、 話劇、音樂劇、體育賽事等領(lǐng)域。但是因?yàn)槠睌?shù)有限,還有黃牛們不能丟了飯碗,所以導(dǎo)致了,很多人都搶不到票,那么,今天帶大家用Python來(lái)制作一個(gè)自動(dòng)搶票的腳本小程序2021-10-10Django 權(quán)限認(rèn)證(根據(jù)不同的用戶,設(shè)置不同的顯示和訪問權(quán)限)
這篇文章主要介紹了Django 權(quán)限認(rèn)證(根據(jù)不同的用戶,設(shè)置不同的顯示和訪問權(quán)限),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2019-07-07Python中的response.text與content區(qū)別詳解
這篇文章主要介紹了Python中的response.text與content區(qū)別詳解,?從網(wǎng)絡(luò)請(qǐng)求下來(lái)的數(shù)據(jù),他們都是字節(jié)類型的,如果服務(wù)器不指定的話,默認(rèn)編碼是"ISO-8859-1",我們使用text直接拿到的是字符串類型,沒有進(jìn)行解碼操作,則會(huì)出現(xiàn)亂碼問題,需要的朋友可以參考下2023-12-12