django model中的choices 动态从数据库中获取

例如

model中,有一个type字段

type = models.CharField(max_length=255, default='BOSS', verbose_name="配置类型",choices=(('boss','boss'),('bass','bass'),))

现在需要从数据库中动态指定该字段的choices,取值的方法为:

# 获取计划类型列表

def get_type_list():

return PlanType.objects.values_list("name", "name")

错误方法:

直接

type = models.CharField(max_length=255, default='BOSS', verbose_name="配置类型",choices=get_type_list())

弊端:

数据库中修改了以后,要重启django应用才能加载

解决方案:

重写model的构造方法,在构造方法中指定该字段的choices即可

def __init__(self, *args, **kwargs):

super(PlanItemConfig, self).__init__(*args, **kwargs)

self._meta.get_field('type').choices = get_type_list()

问题:

调用self._meta毕竟是内部属性,不是太推荐使用

这种方法还有一个问题,定义字段的时候,方法中不能有filter,假如有filter,就会报

django.core.exceptions.AppRegistryNotReady: Models aren't loaded yet.

只能写成全部,可以在 __init__方法中,更新choices的时候,需要使用filter就用filter

我发现在数据库中修改了对应的值后,choises要刷新两次页面才能更新,具体原因未知

此方法还有一个致命的问题:

makemigrations的时候,会执行每个Model的init的方法,此处会执行数据库查询然后变更choices,最后体现在makemigrations生成的py文件中,在多人合作开发的项目中,会造成migrations有问题。

还有一种方法是self.fields['type'].choices更新choices字段。

不过这种方法也有问题,在列表中无效,必须进入编辑页面才能更新choices

可以定义一个ModelForm,在init方法中,更新

class ConfigForm(forms.ModelForm):

def __init__(self, *args, **kwargs):

super(BillingFileMQConfigForm, self).__init__(*args, **kwargs)

# 每次刷新页面都要重新获取choices的值

self.fields['type'].choices = PlanType.objects.values_list("name", "name")

class Meta:

model = Config

fields = '__all__'

然后在ModelAdmin中,指定Form即可

form = ConfigForm

这两种方法各有优劣,方法一可以在admin的列表中展现choices的内容,使用隐藏字段,多人makegrations会有问题。

后来改用了方法二

Django动态获取mysql连接,django model中的choices 动态从数据库中获取相关推荐

  1. java 获取mysql链接_Java中如何获取mysql连接的3种方法总结

    前言 本文主要来说说三种 Java 中获取 mysql 连接的方式,分享出来供大家参考学习,下面话不多说了,来一起看看详细的介绍: 第一种:传统的连接方式: 第二种:读取配置文件方式: 第三种:数据库 ...

  2. mysql升级后将旧数据迁移到新 数据库中

    mysql升级后将旧数据迁移到新 数据库中 1.将原来数据库进行导出成.sql文件 例:StudentSql.sql 2.进入新数据库的bin目录下 复制bin目录 3.cmd进入bin目录下(需管理 ...

  3. navicat导出数据到oracle,使用Navicat premium导出oracle数据库中数据到SQL server2008数据库中...

    使用Navicat premium导出oracle数据库中数据到SQL server2008数据库中 发布时间:2018-08-20 14:41, 浏览次数:471 , 标签: Navicat pre ...

  4. 教你如何使用Java代码从网页中爬取数据到数据库中——网络爬虫精华篇

    文章目录 1:网络爬虫介绍 2:HttpClients类介绍 2.1 HttpGet参数问题 2.2 HttpPost参数问题 2.3 连接池技术问题 3:Jsoup介绍 4:动手实践如何抓取网页上数 ...

  5. 查询oracle数据库的表格数据类型,excel表格中如何查询数据库数据类型-我想把excel表格中的数据导入oracle数据库中,想在......

    在excel表里,什么是:字段.记录.数据类型.多工... declare @t table(id numeric(18,2)) insert into @t SELECT   col1 FROM   ...

  6. 将DataTable中的数据导入到数据库中

    上次在根据excel的文件的路径提取其中表的数据到DataSet中 一文中介绍了将Excel文件中的数据读取到DataSet中的方法,今天我来介绍下我曾经在项目中用到的一个将DataTable中的数据 ...

  7. 网络编程8/17——将dict.txt中的内容导入到数据库中

    目录 代码 运行结果 dict.txt 作业:将dict.txt中的内容导入到数据库中 注意: 导入后检查解释意思是否完整,双词性 中间有空格的单词 o'clock 代码 #include<st ...

  8. 记一次 Java 进程里面获取 Mysql 连接超时的问题排查(OOM)

    文章目录 一. 问题现象 二. 原因分析 1. 查询 Mysql 状态 2. 排查连接池问题 3.进程内存&栈分析 一. 问题现象    页面前端频繁出现 500 的报错,查看后端报错日志,发 ...

  9. Python爬虫项目,获取所有网站上的新闻,并保存到数据库中,解析html网页等(未完待续)

    1.需求说明 需求: 爬取虎嗅网站的所有新闻,并保存到数据库中. http://www.huxiu.com 技术: 1.爬虫 获取服务器的资源(urllib) 解析html网页(BeautifulSo ...

最新文章

  1. 中文 查询_查询商标,商标注册通过分析的几个小技巧
  2. word List16
  3. sql安装联机丛书提示发生网络错误_速达软件:安装问题解答
  4. build.gradle配置参数详解
  5. 工程训练大赛物流小车_27所高校参赛,第六届全国工程训练竞赛湖北赛区比赛落幕...
  6. 锐起无盘服务器改dns,锐起无盘多配置教程-菜鸟版(老鸟飘过)
  7. java 从sip服务器_如何通过域而不是IP地址注册到SIP服务器并从客户端创建SIP帐户?...
  8. 短信API接口怎么调用?
  9. Hibernate(八):检索策略
  10. 为什么快手不能左右滑了_快手现在为什么不能滑动播放了
  11. 未解——Matlab积分运算int函数
  12. 篮球爱好和程序的结合:C#生成NBA赛事预告页面
  13. TGP漏洞:lol无法正常登录问题
  14. 前端网页打印插件print.js
  15. 戴尔linux改win7教程视频,戴尔笔记本win10改win7系统BIOS设置详细教程
  16. Java 10正式发布,带来了这些新特性
  17. Windows10系统CUDA和CUDNN安装教程
  18. mysql LOCATE函数
  19. 【ESP32教程】ESP32EEPROM的使用(使用示例中的eeprom class用法)
  20. JDK1.8安装教程

热门文章

  1. java毕业生设计学生健康管理系统计算机源码+系统+mysql+调试部署+lw
  2. 国产等离子体仿真软件EasyPSim-PIC3D
  3. Ubuntu14.04LTS x64 Eclipse图标为问号及深度音乐卸载后声音状态栏仍显示的解决方法
  4. 给 2020 一份答卷 _ 掘金年度征文
  5. [modem]AP和BP简介
  6. Please contact your system administrator. Add correct host key in
  7. 使用processing写一个仿雷电小游戏
  8. vlc谷歌插件离线安装
  9. 一句话脚本系列之获取eth0网卡的IP地址(或MAC地址)
  10. JAVA冒泡排序的升序和降序