动态设置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 07 Python
python使用PythonMagick将jpg图片转换成ico图片的方法
Mar 26 Python
Python实现将绝对URL替换成相对URL的方法
Jun 28 Python
python中的break、continue、exit()、pass全面解析
Aug 05 Python
Python如何抓取天猫商品详细信息及交易记录
Feb 23 Python
Python实现时钟显示效果思路详解
Apr 11 Python
Python使用paramiko操作linux的方法讲解
Feb 25 Python
python3.7将代码打包成exe程序并添加图标的方法
Oct 11 Python
从numpy数组中取出满足条件的元素示例
Nov 26 Python
tensorflow之并行读入数据详解
Feb 05 Python
Python3连接Mysql8.0遇到的问题及处理步骤
Feb 17 Python
python简单实现9宫格图片实例
Sep 03 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的ob_start();控制您的浏览器cache!
2006/11/25 PHP
php heredoc和phpwind的模板技术使用方法小结
2008/03/28 PHP
php empty,isset,is_null判断比较(差异与异同)
2010/10/19 PHP
php遍历类中包含的所有元素的方法
2015/05/12 PHP
解决laravel-admin 自己新建页面里 js 需要刷新一次的问题
2019/10/03 PHP
jquery插件制作 自增长输入框实现代码
2012/08/17 jQuery
JS实现很实用的对联广告代码(可自适应高度)
2015/09/18 Javascript
JavaScript进阶练习及简单实例分析
2016/06/03 Javascript
Bootstrap选项卡学习笔记分享
2017/02/13 Javascript
node.js express中app.param的用法详解
2017/07/16 Javascript
全面解析jQuery中的$(window)与$(document)的用法区别
2017/08/15 jQuery
提升页面加载速度的插件InstantClick
2017/09/12 Javascript
解决angularJS中input标签的ng-change事件无效问题
2018/09/13 Javascript
vue分页插件的使用方法
2019/12/25 Javascript
JS document内容及样式操作完整示例
2020/01/14 Javascript
js找出5个数中最大的一个数和倒数第二大的数实现方法示例小结
2020/03/04 Javascript
Node.js API详解之 module模块用法实例分析
2020/05/13 Javascript
vue 获取到数据但却渲染不到页面上的解决方法
2020/11/19 Vue.js
Vue如何实现验证码输入交互
2020/12/07 Vue.js
Vue实现手机号、验证码登录(60s禁用倒计时)
2020/12/19 Vue.js
python插入排序算法的实现代码
2013/11/21 Python
Python文件处理
2016/02/29 Python
python字典快速保存于读取的方法
2018/03/23 Python
python实现自动登录后台管理系统
2018/10/18 Python
浅谈pandas用groupby后对层级索引levels的处理方法
2018/11/06 Python
Python将json文件写入ES数据库的方法
2019/04/10 Python
python tqdm库的使用
2020/11/30 Python
GOOD AMERICAN官网:为曲线性感而设计
2017/12/28 全球购物
班组长岗位职责范本
2014/01/05 职场文书
质量承诺书范文
2014/03/27 职场文书
小学教师自我剖析材料
2014/09/29 职场文书
开展党的群众路线教育实践活动情况汇报
2014/11/05 职场文书
小区环境卫生倡议书
2015/04/29 职场文书
在校学生证明格式
2015/06/24 职场文书
一文读懂go中semaphore(信号量)源码
2021/04/03 Golang
SpringBoot项目多数据源及mybatis 驼峰失效的问题解决方法
2022/07/07 Java/Android