动态设置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制作mysql数据迁移脚本
Jan 01 Python
详解python的四种内置数据结构
Mar 19 Python
Python实现字典按key或者value进行排序操作示例【sorted】
May 03 Python
python中break、continue 、exit() 、pass终止循环的区别详解
Jul 08 Python
python的mysql数据库建立表与插入数据操作示例
Sep 30 Python
Python tkinter模版代码实例
Feb 05 Python
python读取与处理netcdf数据方式
Feb 14 Python
python zip,lambda,map函数代码实例
Apr 04 Python
Python爬虫requests库多种用法实例
May 28 Python
用 python 进行微信好友信息分析
Nov 28 Python
python中函数返回多个结果的实例方法
Dec 16 Python
pygame面向对象的飞行小鸟实现(Flappy bird)
Apr 01 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
AMFPHP php远程调用(RPC, Remote Procedure Call)工具 快速入门教程
2010/05/10 PHP
php curl基本操作详解
2013/07/23 PHP
windwos下使用php连接oracle数据库的过程分享
2014/05/26 PHP
php图片的二进制转换实现方法
2014/12/15 PHP
php实现遍历目录并删除指定文件中指定内容
2015/01/21 PHP
Yii2实现增删改查后留在当前页的方法详解
2017/01/13 PHP
JQuery中根据属性或属性值获得元素(6种情况获取方法)
2013/01/17 Javascript
纯js实现瀑布流展现照片(自动适应窗口大小)
2013/04/08 Javascript
使用js检测浏览器的实现代码
2013/05/14 Javascript
利用JS实现浏览器的title闪烁
2013/07/08 Javascript
快速查找数组中的某个元素并返回下标示例
2013/09/03 Javascript
jquery $.trim()方法使用介绍
2014/05/21 Javascript
javascript学习笔记(四)function函数部分
2014/09/30 Javascript
js格式化时间的方法
2015/12/18 Javascript
AngularJS ng-blur 指令详解及简单实例
2016/07/30 Javascript
BootStrap中Table分页插件使用详解
2016/10/09 Javascript
解决nodejs的npm命令无反应的问题
2018/05/17 NodeJs
vue实现添加与删除图书功能
2018/10/07 Javascript
微信小程序如何自定义table组件
2019/06/29 Javascript
LayUI switch 开关监听 获取属性值、更改状态的方法
2019/09/21 Javascript
jquery实现异步文件上传ajaxfileupload.js
2020/10/23 jQuery
[01:02:10]DOTA2上海特级锦标赛B组小组赛#2 VG VS Fnatic第一局
2016/02/26 DOTA
python 梯度法求解函数极值的实例
2019/07/10 Python
python GUI库图形界面开发之PyQt5信号与槽的高级使用技巧装饰器信号与槽详细使用方法与实例
2020/03/06 Python
python 安装移动复制第三方库操作
2020/07/13 Python
python开发入门——set的使用
2020/09/03 Python
Numpy(Pandas)删除全为零的列的方法
2020/09/11 Python
python re的findall和finditer的区别详解
2020/11/15 Python
完美解决IE8下不兼容rgba()的问题
2017/03/31 HTML / CSS
入团者的自我评价分享
2013/12/02 职场文书
优秀的自荐信要注意哪些
2014/01/03 职场文书
学术会议主持词
2014/03/17 职场文书
负责人任命书范本
2014/06/04 职场文书
入党函调证明材料
2014/12/24 职场文书
2015年端午节国旗下演讲稿
2015/03/19 职场文书
PyTorch中permute的使用方法
2022/04/26 Python