动态设置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使用Flask框架同时上传多个文件的方法
Mar 21 Python
在Python的Django框架中simple-todo工具的简单使用
May 30 Python
python探索之BaseHTTPServer-实现Web服务器介绍
Oct 28 Python
基于Python __dict__与dir()的区别详解
Oct 30 Python
Python实现返回数组中第i小元素的方法示例
Dec 04 Python
OpenCV2.3.1+Python2.7.3+Numpy等的配置解析
Jan 05 Python
python list转矩阵的实例讲解
Aug 04 Python
删除DataFrame中值全为NaN或者包含有NaN的列或行方法
Nov 06 Python
Python通用循环的构造方法实例分析
Dec 19 Python
pytorch的梯度计算以及backward方法详解
Jan 10 Python
如何导出python安装的所有模块名称和版本号到文件中
Jun 05 Python
浅谈Python __init__.py的作用
Oct 28 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
ThinkPHP实现跨模块调用操作方法概述
2014/06/20 PHP
解决phpcms更换javascript的幻灯片代码调用图片问题
2014/12/26 PHP
PHP isset empty函数相关面试题及解析
2020/12/11 PHP
node.js中的fs.lchown方法使用说明
2014/12/16 Javascript
浅谈javascript面向对象程序设计
2015/01/21 Javascript
Node.js中的流(Stream)介绍
2015/03/30 Javascript
jQuery实现磁力图片跟随效果完整示例
2016/09/16 Javascript
js实现从左向右滑动式轮播图效果
2017/07/07 Javascript
nodejs基于mssql模块连接sqlserver数据库的简单封装操作示例
2018/01/05 NodeJs
Vue在页面右上角实现可悬浮/隐藏的系统菜单
2018/05/04 Javascript
解决vue2.0路由跳转未匹配相应用路由避免出现空白页面的问题
2018/08/24 Javascript
Angularjs之ngModel中的值验证绑定方法
2018/09/13 Javascript
浅谈Vue.js组件(二)
2019/04/09 Javascript
亲自动手实现vue日历控件
2019/06/26 Javascript
JavaScript经典案例之简易计算器
2020/08/24 Javascript
python使用wxpython开发简单记事本的方法
2015/05/20 Python
python 队列详解及实例代码
2016/10/18 Python
Python使用中文正则表达式匹配指定中文字符串的方法示例
2017/01/20 Python
python3 打印输出字典中特定的某个key的方法示例
2019/07/06 Python
python如何爬取网站数据并进行数据可视化
2019/07/08 Python
python实现井字棋小游戏
2020/03/04 Python
jupyter notebook中新建cell的方法与快捷键操作
2020/04/22 Python
python如何代码集体右移
2020/07/20 Python
Django创建一个后台的基本步骤记录
2020/10/02 Python
Python: glob匹配文件的操作
2020/12/11 Python
python程序实现BTC(比特币)挖矿的完整代码
2021/01/20 Python
html5教程调用绘图api画简单的圆形代码分享
2013/12/04 HTML / CSS
详解如何通过H5(浏览器/WebView/其他)唤起本地app
2017/12/11 HTML / CSS
html5简介及新增功能介绍
2020/05/18 HTML / CSS
amazeui树节点自动展开折叠面板并选中第一个树节点的实现
2020/08/24 HTML / CSS
Chupi官网:在爱尔兰手工制作的订婚、结婚戒指和精美珠宝
2020/09/28 全球购物
北京SQL新华信咨询
2016/09/30 面试题
如何清空Session
2015/02/23 面试题
图书室管理制度
2014/01/19 职场文书
劳动竞赛口号
2014/06/16 职场文书
财务工作犯错检讨书
2014/10/07 职场文书