Django动态获取mysql连接,django model中的choices 动态从数据库中获取
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 动态从数据库中获取相关推荐
- java 获取mysql链接_Java中如何获取mysql连接的3种方法总结
前言 本文主要来说说三种 Java 中获取 mysql 连接的方式,分享出来供大家参考学习,下面话不多说了,来一起看看详细的介绍: 第一种:传统的连接方式: 第二种:读取配置文件方式: 第三种:数据库 ...
- mysql升级后将旧数据迁移到新 数据库中
mysql升级后将旧数据迁移到新 数据库中 1.将原来数据库进行导出成.sql文件 例:StudentSql.sql 2.进入新数据库的bin目录下 复制bin目录 3.cmd进入bin目录下(需管理 ...
- navicat导出数据到oracle,使用Navicat premium导出oracle数据库中数据到SQL server2008数据库中...
使用Navicat premium导出oracle数据库中数据到SQL server2008数据库中 发布时间:2018-08-20 14:41, 浏览次数:471 , 标签: Navicat pre ...
- 教你如何使用Java代码从网页中爬取数据到数据库中——网络爬虫精华篇
文章目录 1:网络爬虫介绍 2:HttpClients类介绍 2.1 HttpGet参数问题 2.2 HttpPost参数问题 2.3 连接池技术问题 3:Jsoup介绍 4:动手实践如何抓取网页上数 ...
- 查询oracle数据库的表格数据类型,excel表格中如何查询数据库数据类型-我想把excel表格中的数据导入oracle数据库中,想在......
在excel表里,什么是:字段.记录.数据类型.多工... declare @t table(id numeric(18,2)) insert into @t SELECT col1 FROM ...
- 将DataTable中的数据导入到数据库中
上次在根据excel的文件的路径提取其中表的数据到DataSet中 一文中介绍了将Excel文件中的数据读取到DataSet中的方法,今天我来介绍下我曾经在项目中用到的一个将DataTable中的数据 ...
- 网络编程8/17——将dict.txt中的内容导入到数据库中
目录 代码 运行结果 dict.txt 作业:将dict.txt中的内容导入到数据库中 注意: 导入后检查解释意思是否完整,双词性 中间有空格的单词 o'clock 代码 #include<st ...
- 记一次 Java 进程里面获取 Mysql 连接超时的问题排查(OOM)
文章目录 一. 问题现象 二. 原因分析 1. 查询 Mysql 状态 2. 排查连接池问题 3.进程内存&栈分析 一. 问题现象 页面前端频繁出现 500 的报错,查看后端报错日志,发 ...
- Python爬虫项目,获取所有网站上的新闻,并保存到数据库中,解析html网页等(未完待续)
1.需求说明 需求: 爬取虎嗅网站的所有新闻,并保存到数据库中. http://www.huxiu.com 技术: 1.爬虫 获取服务器的资源(urllib) 解析html网页(BeautifulSo ...
最新文章
- 中文 查询_查询商标,商标注册通过分析的几个小技巧
- word List16
- sql安装联机丛书提示发生网络错误_速达软件:安装问题解答
- build.gradle配置参数详解
- 工程训练大赛物流小车_27所高校参赛,第六届全国工程训练竞赛湖北赛区比赛落幕...
- 锐起无盘服务器改dns,锐起无盘多配置教程-菜鸟版(老鸟飘过)
- java 从sip服务器_如何通过域而不是IP地址注册到SIP服务器并从客户端创建SIP帐户?...
- 短信API接口怎么调用?
- Hibernate(八):检索策略
- 为什么快手不能左右滑了_快手现在为什么不能滑动播放了
- 未解——Matlab积分运算int函数
- 篮球爱好和程序的结合:C#生成NBA赛事预告页面
- TGP漏洞:lol无法正常登录问题
- 前端网页打印插件print.js
- 戴尔linux改win7教程视频,戴尔笔记本win10改win7系统BIOS设置详细教程
- Java 10正式发布,带来了这些新特性
- Windows10系统CUDA和CUDNN安装教程
- mysql LOCATE函数
- 【ESP32教程】ESP32EEPROM的使用(使用示例中的eeprom class用法)
- JDK1.8安装教程
热门文章
- java毕业生设计学生健康管理系统计算机源码+系统+mysql+调试部署+lw
- 国产等离子体仿真软件EasyPSim-PIC3D
- Ubuntu14.04LTS x64 Eclipse图标为问号及深度音乐卸载后声音状态栏仍显示的解决方法
- 给 2020 一份答卷 _ 掘金年度征文
- [modem]AP和BP简介
- Please contact your system administrator. Add correct host key in
- 使用processing写一个仿雷电小游戏
- vlc谷歌插件离线安装
- 一句话脚本系列之获取eth0网卡的IP地址(或MAC地址)
- JAVA冒泡排序的升序和降序