动态设置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实现的一个p2p文件传输实例
Jun 04 Python
Python实现购物系统(示例讲解)
Sep 13 Python
Python编程之黑板上排列组合,你舍得解开吗
Oct 30 Python
Python实现OpenCV的安装与使用示例
Mar 30 Python
python3.4.3下逐行读入txt文本并去重的方法
Apr 29 Python
Python机器学习k-近邻算法(K Nearest Neighbor)实例详解
Jun 25 Python
Python 支付整合开发包的实现
Jan 23 Python
Python3 导入上级目录中的模块实例
Feb 16 Python
python3 实现的对象与json相互转换操作示例
Aug 17 Python
解决pycharm启动后总是不停的updating indices...indexing的问题
Nov 27 Python
Python装饰器的应用场景代码总结
Apr 10 Python
python 爬虫基本使用——统计杭电oj题目正确率并排序
Oct 26 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下的权限算法的实现
2007/04/28 PHP
php设计模式  Command(命令模式)
2011/06/17 PHP
php按单词截取字符串的方法
2015/04/07 PHP
redirect_uri参数错误的解决方法(必看)
2017/02/16 PHP
thinkPHP框架自动填充原理与用法分析
2018/04/03 PHP
给moz-firefox下添加IE方法和属性
2007/04/10 Javascript
javascript:以前写的xmlhttp池,代码
2008/05/18 Javascript
window.onload 加载完毕的问题及解决方案(下)
2009/07/09 Javascript
JavaScript 图片预览效果 推荐
2009/12/22 Javascript
被jQuery折腾得半死,揭秘为何jQuery为何在IE/Firefox下均无法使用
2010/01/22 Javascript
基于jQuery的让非HTML5浏览器支持placeholder属性的代码
2011/05/24 Javascript
jQuery+ajax实现鼠标单击修改内容的思路
2014/06/29 Javascript
一个JavaScript防止表单重复提交的实例
2014/10/21 Javascript
javascript日期计算实例分析
2015/06/29 Javascript
JS将滑动门改为选项卡(需鼠标点击)的实现方法
2015/09/27 Javascript
JS+CSS实现的蓝色table选项卡效果
2015/10/08 Javascript
JS原型、原型链深入理解
2016/02/27 Javascript
JS代码实现根据时间变换页面背景效果
2016/06/16 Javascript
基于JS模仿windows文件按名称排序效果
2016/06/29 Javascript
jQuery实现的网页换肤效果示例
2016/09/20 Javascript
详解nodejs微信公众号开发——2.自动回复
2017/04/10 NodeJs
React教程之封装一个Portal可复用组件的方法
2018/01/02 Javascript
微信JS-SDK实现微信会员卡功能(给用户微信卡包里发送会员卡)
2019/07/25 Javascript
Vue 3.0 前瞻Vue Function API新特性体验
2019/08/12 Javascript
vue 路由守卫(导航守卫)及其具体使用
2020/02/25 Javascript
Python读取英文文件并记录每个单词出现次数后降序输出示例
2018/06/28 Python
对pandas通过索引提取dataframe的行方法详解
2019/02/01 Python
python实现大文本文件分割
2019/07/22 Python
pycharm修改文件的默认打开方式的步骤
2019/07/29 Python
PyQt5.6+pycharm配置以及pyinstaller生成exe(小白教程)
2020/06/02 Python
检测用户浏览器是否支持CSS3的方法
2009/08/29 HTML / CSS
荷兰之家英文站:Holland at Home
2016/10/26 全球购物
Etam德国:内衣精品店
2019/08/25 全球购物
new修饰符是起什么作用
2015/06/28 面试题
人事主管岗位职责
2014/01/30 职场文书
2015年公路养护工作总结
2015/05/13 职场文书