动态设置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 相关文章推荐
python实现自动更换ip的方法
May 05 Python
Python 数据结构之旋转链表
Feb 25 Python
详解python Todo清单实战
Nov 01 Python
windows下安装Python虚拟环境virtualenvwrapper-win
Jun 14 Python
pandas DataFrame 行列索引及值的获取的方法
Jul 02 Python
Python求正态分布曲线下面积实例
Nov 20 Python
python对Excel按条件进行内容补充(推荐)
Nov 24 Python
Python如何将图像音视频等资源文件隐藏在代码中(小技巧)
Feb 16 Python
Python接口测试环境搭建过程详解
Jun 29 Python
使用jupyter notebook运行python和R的步骤
Aug 13 Python
使用pipenv管理python虚拟环境的全过程
Sep 25 Python
Python matplotlib多个子图绘制整合
Apr 13 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
windows平台中配置nginx+php环境
2015/12/06 PHP
PHP 99乘法表的几种实现代码
2020/10/13 PHP
关于juqery radio写法的兼容性问题(新老版本jquery)
2010/06/14 Javascript
Knockoutjs的环境搭建教程
2012/11/26 Javascript
web开发人员学习jQuery的6大理由及jQuery的优势介绍
2013/01/03 Javascript
JS逆序遍历实现代码
2014/12/02 Javascript
JavaScript获取URL汇总
2015/06/08 Javascript
jQuery中(function($){})(jQuery)详解
2015/07/15 Javascript
原生js实现数字字母混合验证码的简单实例
2015/12/10 Javascript
在Mac OS上安装使用Node.js的项目自动化构建工具Gulp
2016/06/18 Javascript
AngularJS中transclude用法详解
2016/11/03 Javascript
JavaScript队列、优先队列与循环队列
2016/11/14 Javascript
javascript 动态生成css代码的两种方法
2017/03/17 Javascript
webpack公共组件引用路径简化小技巧
2018/06/15 Javascript
在iFrame子页面里实现模态框的方法
2018/08/17 Javascript
用element的upload组件实现多图片上传和压缩的示例代码
2019/02/12 Javascript
element-ui中按需引入的实现
2019/12/25 Javascript
小程序接入腾讯位置服务的详细流程
2020/03/03 Javascript
三剑客:offset、client和scroll还傻傻分不清?
2020/12/04 Javascript
[54:45]2018DOTA2亚洲邀请赛 4.1 小组赛 A组 Optic vs OG
2018/04/02 DOTA
python基础while循环及if判断的实例讲解
2017/08/25 Python
Python面向对象编程基础解析(二)
2017/10/26 Python
Python通过matplotlib画双层饼图及环形图简单示例
2017/12/15 Python
Python简单定义与使用二叉树示例
2018/05/11 Python
django项目搭建与Session使用详解
2018/10/10 Python
python 删除字符串中连续多个空格并保留一个的方法
2018/12/22 Python
python给指定csv表格中的联系人群发邮件(带附件的邮件)
2019/12/31 Python
python3中确保枚举值代码分析
2020/12/02 Python
CSS3五个技巧给你的网站带来出色的效果
2009/04/02 HTML / CSS
HTML5使用drawImage()方法绘制图像
2014/06/23 HTML / CSS
英国排名第一的LED灯泡网站:LED Bulbs
2019/09/03 全球购物
雏鹰争章活动总结
2014/05/09 职场文书
技术岗位竞聘演讲稿
2014/05/16 职场文书
2014年效能监察工作总结
2014/11/21 职场文书
ktv服务员岗位职责
2015/02/09 职场文书
python+opencv实现视频抽帧示例代码
2021/06/11 Python