Django之 ArrayAgg与Admin技巧学习

 更新时间:2023年06月21日 15:15:44   作者:alue  
这篇文章主要为大家介绍了Django之ArrayAgg与Admin的技巧学习,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪

Django Admin 技巧

有这样一个需求, Django 后台 admin 有一个 select 字段, 其备选项是某个系统路径下的文件名, 因此下拉列表的备选项是动态的.

而常规的 select 声明方式如下, 其备选项 choices 是静态的. 如果目标路径的文件发生变动, 必须重启 django 才能获得更新后的下拉列表.

name = models.CharField(max_length=64, choices = (('0','file1'),('0','file1')))

一个自然思路就是, 重载admin的 formfield_for_choice_field(), 在函数内部调用下拉列表获取方法.

但问题是, 一旦选择的值不在上面声明的 choices 中, 表单验证就会失败.

正确的做法是取消 choices 约束, 将字段变成纯字符串型.

name = models.CharField(max_length=64)

这时候, admin 对name的 widget 会由 select 变为 input, 这不是我们想要的. 所以需要手动指定:

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)

这时候, 需要重载的函数就变为了 formfield_for_dbfield() , 按照上述方式构造的admin,就能够实现业务需求.

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]
    },
]

也就是说, 将 ManyToManyField 这种外键直接序列化成列表形式. 这时候可以采用下述方式

A.objects.annotate(
            item_list=ArrayAgg('items',distinct=True)).values(
            'id', 'name', 'item_list')

非常简洁优雅,且这是数据库底层支持的函数, 所有运行效率也非常高.

可以看出, Django项目采用 PostgreSQL 作为数据库还是非常有价值的.

以上就是Django之 ArrayAgg与Admin技巧学习的详细内容,更多关于Django技巧ArrayAgg Admin的资料请关注脚本之家其它相关文章!

相关文章

  • Python使用pip遇到依赖冲突警告时候的排查办法

    Python使用pip遇到依赖冲突警告时候的排查办法

    这篇文章记录了解决pip安装依赖冲突问题的流程,主要解决步骤包括:确认安装是否成功、确认报错提到的冲突包、检查包的来源和是否需要、决定是删除包还是补齐依赖,以及建议为每个项目新建独立的conda环境,需要的朋友可以参考下
    2026-03-03
  • python读取mat文件生成h5文件的实现

    python读取mat文件生成h5文件的实现

    这篇文章主要介绍了python读取mat文件生成h5文件的实现方式,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-07-07
  • Python使用Pyecharts绘制交互式中国地图的流程解析

    Python使用Pyecharts绘制交互式中国地图的流程解析

    Pyecharts作为基于ECharts的Python可视化库,提供三大核心优势,即零代码交互,多级地图支持和高度定制化,下面我们就来看看如何使用Pyecharts绘制交互式中国地图吧
    2026-02-02
  • Python数据处理的三个实用技巧分享

    Python数据处理的三个实用技巧分享

    数据处理无所不在,掌握常用技巧,事半功倍。这篇文章将使用Pandas开展数据处理分析,总结其中常用、好用的数据分析技巧,感兴趣的可以学习一下
    2022-04-04
  • win10系统配置GPU版本Pytorch的详细教程

    win10系统配置GPU版本Pytorch的详细教程

    这篇文章主要介绍了win10系统配置GPU版本Pytorch,本文通过图文并茂的形式给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2021-04-04
  • PyCharm中的库Flask安装以及如何使用详解

    PyCharm中的库Flask安装以及如何使用详解

    在学习flask的过程中关于flask安装的过程中遇到了很多的问题,通过自己的摸索和搜寻最终终于能够成功运行,下面这篇文章主要给大家介绍了关于PyCharm中库Flask安装以及如何使用的相关资料,需要的朋友可以参考下
    2023-12-12
  • python中ransac算法拟合圆的实现

    python中ransac算法拟合圆的实现

    RANSAC是一种用于从包含异常数据的样本数据集中计算数学模型参数的算法,本文主要介绍了python中ransac算法拟合圆的实现,具有一定的参考价值,感兴趣的可以了解一下
    2025-01-01
  • Python报错NameError: name ‘secrets‘ is not defined解决

    Python报错NameError: name ‘secrets‘ is not

    在使用Python进行安全编程时,我们经常需要使用secrets模块来生成安全的随机数,但是却遇到这个问题,本文主要介绍了Python报错NameError: name ‘secrets‘ is not defined解决,感兴趣的可以了解一下
    2024-06-06
  • Python数据库入门从零掌握SQL核心操作

    Python数据库入门从零掌握SQL核心操作

    这篇文章详细介绍了数据库的基本概念、分类、核心组件以及SQL语言的基础知识,包括DDL、DML、DQL和DCL等操作,同时,还提供了MySQL的具体操作示例和数据类型、约束等详细信息,感兴趣的朋友跟随小编一起看看吧
    2025-12-12
  • Python实现按目录层级输出文件名并保存为excel

    Python实现按目录层级输出文件名并保存为excel

    当我们发现电脑的内存很满,或平时工作中文件夹管理不清晰,导致里面的文件数据很杂乱,查找很不方便,一个一个文件夹去看去找然后删除又很浪费时间。本文将介绍如何利用Python实现按目录层级输出文件名并保存为excel,需要的可以参考一下
    2022-02-02

最新评论