django 模型字段设置默认值代码
我就废话不多说了,大家还是直接看代码吧~
classSitService(models.Model): applicationname=models.CharField(max_length=50,primary_key=True) ip=models.CharField(max_length=50) port=models.IntegerField(default=22)#设置默认值为22 path=models.CharField(max_length=50)
补充知识:django设置默认值到SQL
环境:django1.9.7
背景介绍
djangomigrate生成表结构时,默认是不处理default(即字段的default是在django框架层面,没有到数据库层面)。当然,如果只用django来做项目是没有任何问题的,但是如果同一个库被不同框架操作,那么怎么来管理这些表呢是个问题。
项目前端系统使用tornado,后端管理系统使用django,鉴于这种情况,所以就用django来生成所有的表,但是在实际中,不通过django插入的数据全都报错,一查看,全是默认值没有填写的情况。
历史变化
#470"default"valuesshouldbeexpressedinSQLschema
#4800Field'sdefaultvalueinmodelisn'tpassedtoSQL
上面的fix已经过时太久,在1.9.7里面这些都是有的,只是屏蔽了default
详情
跟踪调试发现如下东西
在文件:django/db/backends/base/schema.pyline:128
column_sql方法有如下代码:
defcolumn_sql(self,model,field,include_default=False): ... include_default=include_defaultandnotself.skip_default(field) ifinclude_default: default_value=self.effective_default(field) ifdefault_valueisnotNone: ifself.connection.features.requires_literal_defaults: #Somedatabasescan'ttakedefaultsasaparameter(oracle) #Ifthisisthecase,theindividualschemabackendshould #implementprepare_default sql+="DEFAULT%s"%self.prepare_default(default_value) else: sql+="DEFAULT%s" params+=[default_value] ...
同文件create_model方法在调用column_sql,方法时,没有传递参数,skip_default方法始终返回False
知道了这些后,我们只需要自定义include_default的值就好
当数据库用mysql,longtextandlongblob设置默认值会报错
include_default=Falseifsqlin['longtext','longblob']elseTrue
以上这篇django模型字段设置默认值代码就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持毛票票。