动态设置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基础教程之循环介绍
Aug 29 Python
Python爬虫包 BeautifulSoup  递归抓取实例详解
Jan 28 Python
[原创]pip和pygal的安装实例教程
Dec 07 Python
解决PyCharm import torch包失败的问题
Oct 13 Python
用python生成1000个txt文件的方法
Oct 25 Python
python 字典操作提取key,value的方法
Jun 26 Python
基于Python实现剪切板实时监控方法解析
Sep 11 Python
Python实现获取当前目录下文件名代码详解
Mar 10 Python
Python3.7.0 Shell添加清屏快捷键的实现示例
Mar 23 Python
python多进程使用函数封装实例
May 02 Python
Python使用struct处理二进制(pack和unpack用法)
Nov 12 Python
Python anaconda安装库命令详解
Oct 16 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独立Session数据库存储操作类分享
2014/06/11 PHP
php之readdir函数用法实例
2014/11/13 PHP
PHP url的pathinfo模式加载不同控制器的简单实现
2016/08/12 PHP
laravel 5.4中实现无限级分类的方法示例
2017/07/27 PHP
Laravel相关的一些故障解决
2020/08/19 PHP
IE与Firefox在JavaScript上的7个不同写法小结
2009/09/14 Javascript
获取网站跟路径的javascript代码(站点及虚拟目录)
2009/10/20 Javascript
XMLHTTPRequest的属性和方法简介
2010/11/23 Javascript
实现checkbox全选、反选、取消JavaScript小脚本异常
2014/04/10 Javascript
每天一篇javascript学习小结(Array数组)
2015/11/11 Javascript
JavaScript中ES6字符串扩展方法
2016/08/26 Javascript
js style.display=block显示布局错乱问题的解决方法
2016/09/21 Javascript
jquery获取file表单选择文件的路径、名字、大小、类型
2019/01/18 jQuery
详解 微信小程序开发框架(MINA)
2019/05/17 Javascript
javascript关于“时间”的一次探索
2019/07/24 Javascript
Vue的生命周期操作示例
2019/09/17 Javascript
微信小程序 下拉刷新及上拉加载原理解析
2019/11/06 Javascript
js实现时钟定时器
2020/03/26 Javascript
如何在Vue项目中添加接口监听遮罩
2021/01/25 Vue.js
python连接mysql数据库示例(做增删改操作)
2013/12/31 Python
Python利用Beautiful Soup模块创建对象详解
2017/03/27 Python
python django 实现验证码的功能实例代码
2017/05/18 Python
Python使用Phantomjs截屏网页的方法
2018/05/17 Python
提升python处理速度原理及方法实例
2019/12/25 Python
Python读取配置文件(config.ini)以及写入配置文件
2020/04/08 Python
Python中flatten( ),matrix.A用法说明
2020/07/05 Python
Python3爬虫中pyspider的安装步骤
2020/07/29 Python
CSS3 clip-path 用法介绍详解
2018/03/01 HTML / CSS
image-set实现Retina屏幕下图片显示详细介绍
2012/12/24 HTML / CSS
Debenhams爱尔兰:英国知名的百货公司
2017/01/02 全球购物
小学生作文评语
2014/04/18 职场文书
产品生产计划书
2014/05/07 职场文书
会计专业毕业生求职信
2014/07/04 职场文书
身边的榜样活动方案
2014/08/20 职场文书
欧也妮葛朗台读书笔记
2015/06/30 职场文书
Golang 编译成DLL文件的操作
2021/05/06 Golang