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)用下拉列表獲取方法.
但問(wèn)題是, 一旦選擇的值不在上面聲明的 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使用pip遇到依賴沖突警告時(shí)候的排查辦法
這篇文章記錄了解決pip安裝依賴沖突問(wèn)題的流程,主要解決步驟包括:確認(rèn)安裝是否成功、確認(rèn)報(bào)錯(cuò)提到的沖突包、檢查包的來(lái)源和是否需要、決定是刪除包還是補(bǔ)齊依賴,以及建議為每個(gè)項(xiàng)目新建獨(dú)立的conda環(huán)境,需要的朋友可以參考下2026-03-03
python讀取mat文件生成h5文件的實(shí)現(xiàn)
這篇文章主要介紹了python讀取mat文件生成h5文件的實(shí)現(xiàn)方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-07-07
Python使用Pyecharts繪制交互式中國(guó)地圖的流程解析
Pyecharts作為基于ECharts的Python可視化庫(kù),提供三大核心優(yōu)勢(shì),即零代碼交互,多級(jí)地圖支持和高度定制化,下面我們就來(lái)看看如何使用Pyecharts繪制交互式中國(guó)地圖吧2026-02-02
Python數(shù)據(jù)處理的三個(gè)實(shí)用技巧分享
數(shù)據(jù)處理無(wú)所不在,掌握常用技巧,事半功倍。這篇文章將使用Pandas開(kāi)展數(shù)據(jù)處理分析,總結(jié)其中常用、好用的數(shù)據(jù)分析技巧,感興趣的可以學(xué)習(xí)一下2022-04-04
win10系統(tǒng)配置GPU版本Pytorch的詳細(xì)教程
這篇文章主要介紹了win10系統(tǒng)配置GPU版本Pytorch,本文通過(guò)圖文并茂的形式給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2021-04-04
python中ransac算法擬合圓的實(shí)現(xiàn)
RANSAC是一種用于從包含異常數(shù)據(jù)的樣本數(shù)據(jù)集中計(jì)算數(shù)學(xué)模型參數(shù)的算法,本文主要介紹了python中ransac算法擬合圓的實(shí)現(xiàn),具有一定的參考價(jià)值,感興趣的可以了解一下2025-01-01
Python報(bào)錯(cuò)NameError: name ‘secrets‘ is not
在使用Python進(jìn)行安全編程時(shí),我們經(jīng)常需要使用secrets模塊來(lái)生成安全的隨機(jī)數(shù),但是卻遇到這個(gè)問(wèn)題,本文主要介紹了Python報(bào)錯(cuò)NameError: name ‘secrets‘ is not defined解決,感興趣的可以了解一下2024-06-06
Python數(shù)據(jù)庫(kù)入門(mén)從零掌握SQL核心操作
這篇文章詳細(xì)介紹了數(shù)據(jù)庫(kù)的基本概念、分類、核心組件以及SQL語(yǔ)言的基礎(chǔ)知識(shí),包括DDL、DML、DQL和DCL等操作,同時(shí),還提供了MySQL的具體操作示例和數(shù)據(jù)類型、約束等詳細(xì)信息,感興趣的朋友跟隨小編一起看看吧2025-12-12
Python實(shí)現(xiàn)按目錄層級(jí)輸出文件名并保存為excel
當(dāng)我們發(fā)現(xiàn)電腦的內(nèi)存很滿,或平時(shí)工作中文件夾管理不清晰,導(dǎo)致里面的文件數(shù)據(jù)很雜亂,查找很不方便,一個(gè)一個(gè)文件夾去看去找然后刪除又很浪費(fèi)時(shí)間。本文將介紹如何利用Python實(shí)現(xiàn)按目錄層級(jí)輸出文件名并保存為excel,需要的可以參考一下2022-02-02

