动态设置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 相关文章推荐
Django中对通过测试的用户进行限制访问的方法
Jul 23 Python
python实现学生信息管理系统
Apr 05 Python
简单谈谈Python的pycurl模块
Apr 07 Python
Python走楼梯问题解决方法示例
Jul 25 Python
基于python实现聊天室程序
Jul 27 Python
Numpy之文件存取的示例代码
Aug 03 Python
Python实现多级目录压缩与解压文件的方法
Sep 01 Python
使用Python-OpenCV向图片添加噪声的实现(高斯噪声、椒盐噪声)
May 28 Python
Python面向对象之多态原理与用法案例分析
Dec 30 Python
Eclipse配置python默认头过程图解
Apr 26 Python
Python发送邮件封装实现过程详解
May 09 Python
用python开发一款操作MySQL的小工具
May 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中提问频率最高的11个面试题和答案
2014/09/02 PHP
smarty内置函数foreach用法实例
2015/01/22 PHP
浅谈PHP中的Trait使用方法
2019/03/22 PHP
PHP利用百度ai实现文本和图片审核
2019/05/08 PHP
基于json的jquery地区联动效果代码
2011/07/06 Javascript
JavaScript必知必会(十) call apply bind的用法说明
2016/06/08 Javascript
Java  Spring 事务回滚详解
2016/10/17 Javascript
jQuery Easyui datagrid editor为combobox时指定数据源实例
2016/12/19 Javascript
JS批量替换内容中关键词为超链接
2017/02/20 Javascript
bootstrap table插件的分页与checkbox使用详解
2017/07/23 Javascript
JavaScript函数节流和函数去抖知识点学习
2018/07/31 Javascript
JavaScript之解构赋值的理解
2019/01/30 Javascript
three.js着色器材质的内置变量示例详解
2020/08/16 Javascript
vue2.0 watch里面的 deep和immediate用法说明
2020/10/30 Javascript
解决VueCil代理本地proxytable无效报错404的问题
2020/11/07 Javascript
Vue如何实现验证码输入交互
2020/12/07 Vue.js
使用jquery实现轮播图效果
2021/01/02 jQuery
python中的hashlib和base64加密模块使用实例
2014/09/02 Python
在Python的Flask框架中验证注册用户的Email的方法
2015/09/02 Python
Python学习小技巧之列表项的推导式与过滤操作
2017/05/20 Python
基于python代码实现简易滤除数字的方法
2018/07/17 Python
详解配置Django的Celery异步之路踩坑
2018/11/25 Python
Django框架模板注入操作示例【变量传递到模板】
2018/12/19 Python
PyQt5图形界面播放音乐的实例
2019/06/17 Python
解决Python3下map函数的显示问题
2019/12/04 Python
python实现电子词典
2020/03/03 Python
浅析Python 条件控制语句
2020/07/15 Python
CSS3打造磨砂玻璃背景效果
2016/09/28 HTML / CSS
Under Armour安德玛荷兰官网:美国高端运动科技品牌
2019/07/10 全球购物
餐饮企业总经理岗位职责范文
2014/02/18 职场文书
2014年百日安全生产活动总结
2014/05/04 职场文书
电子信息专业应届生自荐信
2014/06/04 职场文书
医院领导班子查摆问题对照检查材料思想汇报
2014/10/08 职场文书
第二次离婚起诉书
2015/05/18 职场文书
SpringBoot连接MySQL获取数据写后端接口的操作方法
2021/11/02 MySQL
MySQL选择合适的备份策略和备份工具
2022/06/01 MySQL