动态设置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中的对象拷贝示例 python引用传递
Jan 23 Python
使用python实现递归版汉诺塔示例(汉诺塔递归算法)
Apr 08 Python
Python实现的二维码生成小软件
Jul 11 Python
python正则表达式中的括号匹配问题
Dec 14 Python
Python的IDEL增加清屏功能实例
Jun 19 Python
Python实现登录接口的示例代码
Jul 21 Python
详解Python里使用正则表达式的ASCII模式
Nov 02 Python
pandas DataFrame行或列的删除方法的实现示例
Aug 02 Python
Mac中PyCharm配置Anaconda环境的方法
Mar 04 Python
python实现学生成绩测评系统
Jun 22 Python
python 通过exifread读取照片信息
Dec 24 Python
python drf各类组件的用法和作用
Jan 12 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将网址字符串转换成超链接(网址或email)
2010/05/25 PHP
去除php注释和去除空格函数分享
2014/03/13 PHP
PHP常用的缓存技术汇总
2014/05/05 PHP
PHP下载生成的csv文件及问题总结
2015/08/06 PHP
PHP容器类的两种实现方式示例
2019/07/24 PHP
Gambit vs CL BO3 第二场 2.13
2021/03/10 DOTA
javascript 字符 Escape,encodeURI,encodeURIComponent
2009/07/09 Javascript
JQuery select标签操作代码段
2010/05/16 Javascript
过虑特殊字符输入的js代码
2010/08/05 Javascript
没有document.getElementByName方法
2013/08/19 Javascript
JS Replace 全部替换字符的用法小结
2013/12/24 Javascript
JavaScript使用DeviceOne开发实战(三)仿微信应用
2015/12/02 Javascript
jQuery插件FusionCharts实现的Marimekko图效果示例【附demo源码】
2017/03/24 jQuery
vue.js实现单选框、复选框和下拉框示例
2017/07/18 Javascript
浅谈Angular4实现热加载开发旅程
2017/09/08 Javascript
Node.js学习之地址解析模块URL的使用详解
2017/09/28 Javascript
原生JS+HTML5实现跟随鼠标一起流动的粒子动画效果
2018/05/03 Javascript
Vue2.0实现组件之间数据交互和通信操作示例
2019/05/16 Javascript
150行Node.js实现的dns代理工具
2019/08/02 Javascript
JS开发自己的类库实例分析
2019/08/28 Javascript
jquery 回调操作实例分析【回调成功与回调失败的情况】
2019/09/27 jQuery
对pycharm代码整体左移和右移缩进快捷键的介绍
2018/07/16 Python
matplotlib给子图添加图例的方法
2018/08/03 Python
python 将list转成字符串,中间用符号分隔的方法
2018/10/23 Python
Python和Go语言的区别总结
2019/02/20 Python
Python使用numpy模块实现矩阵和列表的连接操作方法
2019/06/26 Python
pytorch神经网络之卷积层与全连接层参数的设置方法
2019/08/18 Python
Python切图九宫格的实现方法
2019/10/10 Python
利用CSS3实现圆角的outline效果的教程
2015/06/05 HTML / CSS
护士专业推荐信
2013/11/02 职场文书
员工工作表扬信范文
2014/01/13 职场文书
学雷锋活动总结报告
2014/06/26 职场文书
保安辞职信范文
2015/02/28 职场文书
综合办公室主任岗位职责
2015/04/01 职场文书
2015年乡镇工作总结范文
2015/04/22 职场文书
解决Python保存文件名太长OSError: [Errno 36] File name too long
2022/05/11 Python