我就废话不多说了,大家还是直接看代码吧~
1
2
3
4
5
|
class SitService(models.Model):
applicationname = models.CharField(max_length = 50 ,primary_key = True )
ip = models.CharField(max_length = 50 )
path = models.CharField(max_length = 50 )
|
补充知识:django 设置默认值到SQL
环境:django 1.9.7
背景介绍
django migrate 生成表结构时,默认是不处理default(即字段的default 是在django 框架层面,没有到数据库层面)。当然,如果只用django 来做项目是没有任何问题的,但是如果同一个库被不同框架操作,那么怎么来管理这些表呢是个问题。
项目前端系统使用tornado,后端管理系统使用django, 鉴于这种情况,所以就用django来生成所有的表,但是在实际中,不通过django 插入的数据全都报错,一查看,全是默认值没有填写的情况。
历史变化
#470 "default" values should be expressed in SQL schema
#4800 Field's default value in model isn't passed to SQL
上面的fix已经过时太久,在1.9.7里面这些都是有的,只是屏蔽了default
详情
跟踪调试发现如下东西
在文件: django/db/backends/base/schema.py line:128
column_sql 方法有如下代码:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
|
def column_sql( self , model, field, include_default = False ):
...
include_default = include_default and not self .skip_default(field)
if include_default:
default_value = self .effective_default(field)
if default_value is not None :
if self .connection.features.requires_literal_defaults:
# Some databases can't take defaults as a parameter (oracle)
# If this is the case, the individual schema backend should
# implement prepare_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, longtext and longblob 设置默认值会报错
include_default = False if sql in ['longtext', 'longblob'] else True
以上这篇django 模型字段设置默认值代码就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持服务器之家。
原文链接:https://blog.csdn.net/weixin_39318540/article/details/90437544