动态设置django的model field的默认值操作步骤


Posted in Python onMarch 30, 2020

问题背景

django的model field需要动态设置默认值,具体案例如下:

原始代码如下,model是Application,其中字段ignore_fort的默认值设置为False

class Application(TimestampedModel):
  name = models.CharField(max_length=255, null=True)
  ignore_fort = models.BooleanField(default=False)

然而现在有这样一个需求:default需要根据某个变量ENV进行动态设置,如果ENV是UAT或者FAT(不区分大小写,具体分支,比如uaT01也可以),则default设置为True,否则设置为False

首先想到的是如下代码:

class Application(TimestampedModel):
  name = models.CharField(max_length=255, null=True)
  ignore_fort = models.BooleanField(default= 'UAT'in ENV.upper() or 'FAT' in ENV.upper())

通过python manage.py shell_plus启动shell调试,发现如果ENV本来设置的是什么值,逻辑正确,如果在shell中修改ENV的值,则新建的model的ignore_fort值并不是根据当前ENV值进行设置,而是保持原来的值,达不到需求。例如,ENV值本来设置为uat,那么新建app = Application(),print app.ignore_fort结果是True,修改ENV ENV = 'hhh',app1 = Application(); print app1.ignore_fort结果还是True,而我们需要的是False。

分析

官方描述如下:

The default value for the field. This can be a value or a callable object. If callable it will be called every time a new object is created.

如果想要在创建对象时动态修改default的值,需要用callable object,可以理解为函数调用?

上述代码的default值并不是callable object,所以并不是在object创建时同台更新。

解决方法

参考 正解如下,用一个函数调用实现callable object,进而实现动态跟新default

def get_default_ignore_fort():
  cur_env =ENV.upper()
  return any(i in cur_env for i in ('UAT', 'FAT'))


class Application(TimestampedModel):
  name = models.CharField(max_length=255, null=True)
  ignore_fort = models.BooleanField(default=get_default_ignore_fort)

补充知识:Django ModelChoiceField:过滤查询集并将默认值设置为对象

我有一个Django Form类定义喜欢这个在Models:

class AccountDetailsForm(forms.Form):
  ...
  adminuser = forms.ModelChoiceField(queryset=User.objects.all())

这工作正常,但它有一些限制,我似乎不能解决:

(1)我想在查询集上使用一个过滤器,基于传递给表单的变量accountid,如下所示:

User.objects.filter(account=accountid)

这不能在模型中工作,因为accountid不能作为一个变量传递,当然。

因此,查询集必须以某种方式在视图中定义,但就我可以看到它是一个必需的字段在Form类。

(2)我想默认选择AccountDetailsForm数据库中的一个对象,我可以在视图中选择这样:

User.objects.filter(account=accountid).filter(primary_user=1)

我试过指定adminuser作为默认值在窗体中,(它与其他标准表单字段,如CharField工作):

adminuser = User.objects.filter(account=accountid).filter(primary_user=1)

...

form = AccountDetailsForm({'adminuser': adminuser})
return render_to_response('accounts/edit/accountdetails.html', 
{'form': form, 'account':account})

但没有运气。

我应该使用除ModelChoiceField之外的其他方式给我这里需要的灵活性吗?

谢谢。

覆盖init方法并接受新的关键字参数

class AccountDetailsForm(forms.Form):
  ...
  adminuser = forms.ModelChoiceField(queryset=User.objects.all())
  def __init__(self, *args, **kwargs):
    accountid = kwargs.pop('accountid', None)
    super(AccountDetailsForm, self).__init__(*args, **kwargs)

    if accountid:
      self.fields['adminuser'].queryset = User.objects.filter(account=accountid)

form = AccountDetailsForm(accountid=3)

您可以随时在视图中手动设置选择。

form = AccountDetailsForm()
form.fields['adminuser'].queryset = User.objects.filter(account=accountid)

警告:您不是通过将字典传递到您的示例中的表单来设置默认值。

你实际上创建了一个绑定表,可能触发验证和所有的爵士。

要设置默认值,use the initials argument.

form = AccountDetailsForm(initial={'adminuser':'3'})

翻译自:这里

以上这篇动态设置django的model field的默认值操作步骤就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持三水点靠木。

Python 相关文章推荐
本地文件上传到七牛云服务器示例(七牛云存储)
Jan 11 Python
Python中声明只包含一个元素的元组数据方法
Aug 25 Python
Python使用matplotlib绘制动画的方法
May 20 Python
Python写入数据到MP3文件中的方法
Jul 10 Python
Python中定时任务框架APScheduler的快速入门指南
Jul 06 Python
Python实现的插入排序算法原理与用法实例分析
Nov 22 Python
tensor和numpy的互相转换的实现示例
Aug 02 Python
python 解决flask uwsgi 获取不到全局变量的问题
Dec 22 Python
关于Python 中的时间处理包datetime和arrow的方法详解
Mar 19 Python
Pycharm配置PyQt5环境的教程
Apr 02 Python
python 图像增强算法实现详解
Jan 24 Python
Python first-order-model实现让照片动起来
Jun 25 Python
python数据库操作mysql:pymysql、sqlalchemy常见用法详解
Mar 30 #Python
django 实现手动存储文件到model的FileField
Mar 30 #Python
解决django FileFIELD的编码问题
Mar 30 #Python
Python动态导入模块:__import__、importlib、动态导入的使用场景实例分析
Mar 30 #Python
Django 删除upload_to文件的步骤
Mar 30 #Python
python with语句的原理与用法详解
Mar 30 #Python
对django 2.x版本中models.ForeignKey()外键说明介绍
Mar 30 #Python
You might like
PHP关联数组的10个操作技巧
2013/01/21 PHP
php 使用curl模拟ip和来源进行访问的实现方法
2017/05/02 PHP
PHP实现的杨辉三角求解算法分析
2019/03/11 PHP
Vagrant(WSL)+PHPStorm+Xdebu 断点调试环境搭建
2019/12/13 PHP
window.addeventjs事件驱动函数集合addEvent等
2008/02/19 Javascript
jQuery插件 tabBox实现代码
2010/02/09 Javascript
js获取光标位置和设置文本框光标位置示例代码
2014/01/09 Javascript
JavaScript实现节点的删除与序号重建实例
2015/08/05 Javascript
基于JavaScript实现树形下拉框
2016/08/10 Javascript
javascript self对象使用详解
2016/10/18 Javascript
react-router中的属性详解
2017/06/01 Javascript
javascript实现二叉树的代码
2017/06/08 Javascript
Vue-Cli中自定义过滤器的实现代码
2017/08/12 Javascript
利用jqprint插件打印页面内容的实现方法
2018/01/09 Javascript
Laravel整合Bootstrap 4的完整方案(推荐)
2018/01/25 Javascript
在create-react-app中使用css modules的示例代码
2018/07/31 Javascript
Node.js EventEmmitter事件监听器用法实例分析
2019/01/07 Javascript
vxe-table vue table 表格组件功能
2019/05/26 Javascript
微信h5静默和非静默授权获取用户openId的方法和步骤
2020/06/08 Javascript
python实现支持目录FTP上传下载文件的方法
2015/06/03 Python
Python之csv文件从MySQL数据库导入导出的方法
2018/06/21 Python
对numpy.append()里的axis的用法详解
2018/06/28 Python
浅述python中深浅拷贝原理
2018/09/18 Python
python 遍历pd.Series的index和value
2019/11/26 Python
Python udp网络程序实现发送、接收数据功能示例
2019/12/09 Python
Selenium 配置启动项参数的方法
2020/12/04 Python
opencv python 对指针仪表读数识别的两种方式
2021/01/14 Python
HTML5 script元素async、defer异步加载使用介绍
2013/08/23 HTML / CSS
YOINS官网:时尚女装网上购物
2017/03/17 全球购物
食品厂厂长岗位职责
2014/01/30 职场文书
文秘大学生求职信
2014/02/25 职场文书
出国留学计划书
2014/04/27 职场文书
出租车拒载检讨书
2015/01/28 职场文书
MySQL 可扩展设计的基本原则
2021/05/14 MySQL
python b站视频下载的五种版本
2021/05/27 Python
pandas求平均数和中位数的方法实例
2021/08/04 Python