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的资料请关注脚本之家其它相关文章!

相关文章

  • 在django模板中实现超链接配置

    在django模板中实现超链接配置

    今天小编就为大家分享一篇在django模板中实现超链接配置,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2019-08-08
  • Python实现的远程文件自动打包并下载功能示例

    Python实现的远程文件自动打包并下载功能示例

    这篇文章主要介绍了Python实现的远程文件自动打包并下载功能,结合实例形式分析了Python使用spawn()方法执行ssh、scp 命令实现远程文件的相关操作技巧,需要的朋友可以参考下
    2019-07-07
  • 为了顺利买到演唱会的票用Python制作了自动抢票的脚本

    为了顺利买到演唱会的票用Python制作了自动抢票的脚本

    大麦网,是中国综合类现场娱乐票务营销平台,业务覆盖演唱会、 话剧、音乐剧、体育赛事等领域。但是因为票数有限,还有黄牛们不能丢了饭碗,所以导致了,很多人都抢不到票,那么,今天带大家用Python来制作一个自动抢票的脚本小程序
    2021-10-10
  • pandas loc iloc ix用法详细分析

    pandas loc iloc ix用法详细分析

    pandas处理数据时,我们会经常看到dataframe结构使用loc, iloc, ix等方法,那么这些方法到底有啥区别,下面我们来进行详细分析,感兴趣的朋友跟随小编一起看看吧
    2023-01-01
  • Django 权限认证(根据不同的用户,设置不同的显示和访问权限)

    Django 权限认证(根据不同的用户,设置不同的显示和访问权限)

    这篇文章主要介绍了Django 权限认证(根据不同的用户,设置不同的显示和访问权限),文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2019-07-07
  • Python中的response.text与content区别详解

    Python中的response.text与content区别详解

    这篇文章主要介绍了Python中的response.text与content区别详解, 从网络请求下来的数据,他们都是字节类型的,如果服务器不指定的话,默认编码是"ISO-8859-1",我们使用text直接拿到的是字符串类型,没有进行解码操作,则会出现乱码问题,需要的朋友可以参考下
    2023-12-12
  • OpenAI Function Calling特性示例详解

    OpenAI Function Calling特性示例详解

    这篇文章主要为大家介绍了OpenAI Function Calling特性作用详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-07-07
  • python实现的简单文本类游戏实例

    python实现的简单文本类游戏实例

    这篇文章主要介绍了python实现的简单文本类游戏,以两个实例形式分析了python操作文本与字符串的相关技巧,具有一定参考借鉴价值,需要的朋友可以参考下
    2015-04-04
  • Python列表解析配合if else的方法

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

    今天小编就为大家分享一篇Python列表解析配合if else的方法,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2018-06-06
  • 在PyCharm中三步完成PyPy解释器的配置的方法

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

    今天小编就为大家分享一篇在PyCharm中三步完成PyPy解释器的配置的方法,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2018-10-10

最新评论