动态设置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 相关文章推荐
Java Web开发过程中登陆模块的验证码的实现方式总结
May 25 Python
python生成器,可迭代对象,迭代器区别和联系
Feb 04 Python
django 发送邮件和缓存的实现代码
Jul 18 Python
Sanic框架应用部署方法详解
Jul 18 Python
python配置grpc环境
Jan 01 Python
Python 利用pydub库操作音频文件的方法
Jan 09 Python
Python数据可视化之画图
Jan 15 Python
Python实现一个带权无回置随机抽选函数的方法
Jul 24 Python
python pygame实现滚动横版射击游戏城市之战
Nov 25 Python
基于pytorch的lstm参数使用详解
Jan 14 Python
python 基于selenium实现鼠标拖拽功能
Dec 24 Python
Python tkinter之Bind(绑定事件)的使用示例
Feb 05 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插入中文到sqlserver 2008里出现乱码的解决办法分享
2012/07/19 PHP
深入理解PHP类的自动载入机制
2016/09/16 PHP
统计出现最多的字符次数的js代码
2010/12/03 Javascript
JavaScript等比例缩放图片控制超出范围的图片
2013/08/06 Javascript
纯JS实现根据CSS的class选择DOM
2014/03/22 Javascript
jquery禁止输入数字以外的字符的示例(纯数字验证码)
2014/04/10 Javascript
jquery用offset()方法获得元素的xy坐标
2014/09/06 Javascript
2014年50个程序员最适用的免费JQuery插件
2014/12/15 Javascript
修改或扩展jQuery原生方法的代码实例
2015/01/13 Javascript
jQuery实现冻结表格行和列
2015/04/29 Javascript
js的flv视频播放器插件使用方法
2015/06/23 Javascript
js实现跨域的4种实用方法原理分析
2015/10/29 Javascript
js实现图片轮播效果
2015/12/19 Javascript
探析浏览器执行JavaScript脚本加载与代码执行顺序
2016/01/12 Javascript
轻松实现JavaScript图片切换
2016/01/12 Javascript
封装获取dom元素的简单实例
2016/07/08 Javascript
JQuery和PHP结合实现动态进度条上传显示
2016/11/23 Javascript
详解利用 Vue.js 实现前后端分离的RBAC角色权限管理
2017/09/15 Javascript
Javascript实现运算符重载详解
2018/04/07 Javascript
layui select获取自定义属性方法
2018/08/15 Javascript
详解angularjs跨页面传参遇到的一些问题
2018/11/01 Javascript
微信小程序实现省市区三级地址选择
2020/06/21 Javascript
vue通过数据过滤实现表格合并
2020/11/30 Javascript
js模拟F11页面全屏显示
2019/09/17 Javascript
Vue 打包体积优化方案小结
2020/05/20 Javascript
使用python检测手机QQ在线状态的脚本代码
2013/02/10 Python
利用Python将文本中的中英文分离方法
2018/10/31 Python
Python中的支持向量机SVM的使用(附实例代码)
2019/06/26 Python
Python实现Selenium自动化Page模式
2019/07/14 Python
浅谈Keras的Sequential与PyTorch的Sequential的区别
2020/06/17 Python
YSL圣罗兰美妆美国官网:Yves Saint Lauret US
2016/11/21 全球购物
党的群众路线教育实践活动党员个人整改措施
2014/10/27 职场文书
会议通知范文
2015/04/15 职场文书
交通事故代理词范文
2015/05/23 职场文书
vue点击弹窗自动触发点击事件的解决办法(模拟场景)
2021/05/25 Vue.js
死磕 java同步系列之synchronized解析
2021/06/28 Java/Android