欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

Django之 ArrayAgg與Admin技巧學(xué)習(xí)

 更新時(shí)間:2023年06月21日 15:15:44   作者:alue  
這篇文章主要為大家介紹了Django之ArrayAgg與Admin的技巧學(xué)習(xí),有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪

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列表解析配合if else的方法

    Python列表解析配合if else的方法

    今天小編就為大家分享一篇Python列表解析配合if else的方法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2018-06-06
  • 在PyCharm中三步完成PyPy解釋器的配置的方法

    在PyCharm中三步完成PyPy解釋器的配置的方法

    今天小編就為大家分享一篇在PyCharm中三步完成PyPy解釋器的配置的方法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2018-10-10
  • 最新評(píng)論