动态设置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 相关文章推荐
python33 urllib2使用方法细节讲解
Dec 03 Python
在Python中用get()方法获取字典键值的教程
May 21 Python
理解python正则表达式
Jan 15 Python
浅谈numpy中linspace的用法 (等差数列创建函数)
Jun 07 Python
Django中使用Celery的方法示例
Nov 29 Python
Python 保存矩阵为Excel的实现方法
Jan 28 Python
pandas去重复行并分类汇总的实现方法
Jan 29 Python
python 表格打印代码实例解析
Oct 12 Python
python快速排序的实现及运行时间比较
Nov 22 Python
Windows+Anaconda3+PyTorch+PyCharm的安装教程图文详解
Apr 03 Python
python Django 反向访问器的外键冲突解决
May 20 Python
Python必备技巧之字符数据操作详解
Mar 23 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
mysql 的 like 问题,超强毕杀记!!!
2007/01/18 PHP
php 操作excel文件的方法小结
2009/12/31 PHP
来自phpguru得Php Cache类源码
2010/04/15 PHP
php中限制ip段访问、禁止ip提交表单的代码分享
2014/08/22 PHP
PHP实现的带超时功能get_headers函数
2015/02/10 PHP
Thinkphp3.2.3分页使用实例解析
2016/07/28 PHP
基于yaf框架和uploadify插件,做的一个导入excel文件,查看并保存数据的功能
2017/01/24 PHP
php 提交表单 关闭layer弹窗iframe的实例讲解
2018/08/20 PHP
jquery判断字符输入个数(数字英文长度记为1,中文记为2,超过长度自动截取)
2010/10/15 Javascript
最短的IE判断代码
2011/03/13 Javascript
避免回车键导致的页面无意义刷新的解决方法
2011/04/12 Javascript
jquery及原生js获取select下拉框选中的值示例
2013/10/25 Javascript
jquery中get和post的简单实例
2014/02/04 Javascript
jquery 淡入淡出效果的简单实现
2014/02/07 Javascript
JavaScript实现图片轮播的方法
2015/07/31 Javascript
用JavaScript动态建立或增加CSS样式表的实现方法
2016/05/20 Javascript
微信小程序  audio音频播放详解及实例
2016/11/02 Javascript
EasyUI学习之Combobox级联下拉列表(2)
2016/12/29 Javascript
jquery仿微信聊天界面
2017/05/06 jQuery
Vue中JS动画与Velocity.js的结合使用
2019/02/13 Javascript
vue设计一个倒计时秒杀的组件详解
2019/04/06 Javascript
JS使用new操作符创建对象的方法分析
2019/05/30 Javascript
基于better-scroll 实现歌词联动功能的代码
2020/05/07 Javascript
Vue实现简单购物车功能
2020/12/13 Vue.js
django 多数据库配置教程
2018/05/30 Python
django 中使用DateTime常用的时间查询方式
2019/12/03 Python
tensorflow 利用expand_dims和squeeze扩展和压缩tensor维度方式
2020/02/07 Python
通过python-pptx模块操作ppt文件的方法
2020/12/26 Python
CSS3旋转——彩色扇子兼容firefox浏览器
2013/06/04 HTML / CSS
Bootstrap 学习分享
2012/11/12 HTML / CSS
一些Unix笔试题和面试题
2012/09/25 面试题
质量工程师岗位职责
2013/11/16 职场文书
在校学生职业规划范文
2014/01/08 职场文书
小学教师个人先进事迹材料
2014/05/17 职场文书
单方离婚协议书范本(2014版)
2014/09/30 职场文书
python index() 与 rindex() 方法的使用示例详解
2022/12/24 Python