【004】- Django模型定义
模型是有关数据的唯一确定的信息源。 它包含你要存储的数据的基本字段和行为。 通常,每个模型都映射到单个数据库表。特点每个模型都是继承自 django.db.models.Model 的子类模型中每个属性表示数据库中每个字段Django为我们提供了自动访问数据库的API属性定义Django会为表创建自动增长的主键列,每个模型只能有一个主键列,如果使用选项设置某属性为主键列后Djang...
模型是有关数据的唯一确定的信息源。 它包含你要存储的数据的基本字段和行为。 通常,每个模型都映射到单个数据库表。
特点
- 每个模型都是继承自 django.db.models.Model 的子类
- 模型中每个属性表示数据库中每个字段
- Django为我们提供了自动访问数据库的API
模型类属性定义
Django会为表创建自动增长的主键列,每个模型只能有一个主键列,如果使用选项设置某属性为主键列后Django不会再创建自动增长的主键列。
默认创建的主键列属性为id,可以使用pk代替,pk全拼为primary key。
属性定义规则:
- 不能是python的保留关键字
- 不允许使用连续的下划线,这是由django的查询方式决定的
- 定义属性时需要指定字段类型,通过字段类型的参数指定选项,格式如
属性=models.字段类型(选项)
模型类字段类型
Django常用字段类型如下
AutoField:自动增长的IntegerField,通常不用指定,不指定时Django会自动创建属性名为id的自动增长属性。
BooleanField:布尔字段,值为True或False
CharField(max_length=字符长度):字符串
DateField[auto_now=False, auto_now_add=False]):日期
参数auto_now表示每次保存对象时,自动设置该字段为当前时间,用于"最后一次修改"的时间戳,它总是使用当前日期,默认为false。
参数auto_now_add表示当对象第一次被创建时自动设置当前时间,用于创建的时间戳,它总是使用当前日期,默认为false。
参数auto_now_add和auto_now是相互排斥的,组合将会发生错误。
DateTimeField:日期时间,参数同DateField。
DecimalField(max_digits=None, decimal_places=None):十进制浮点数
max_digits表示总位数
decimal_places表示小数位数
FloatField:浮点数
TextField:大文本字段,一般超过4000个字符时使用
FileField:上传文件字段
ImageField:继承于FileField,对上传的内容进行校验,确保是有效的图片
模型类常用字段选项说明
null:如果为True,表示允许为空,默认值是False
blank:如果为True,则该字段允许为空白,默认值是False
db_column:字段的名称,如果未指定,则使用属性的名称
db_index:若值为True, 则在表中会为此字段创建索引,默认值是False
default:默认值
primary_key:若为True,则该字段会成为模型的主键字段,默认值是False,一般作为AutoField的选项使用
unique:如果为True, 这个字段在表中必须有唯一值,默认值是False
choices:字段值,在定义的列表中选择
综合案例
from django.db import models
class User(models.Model):
""" 用户模型类 """
SEX_CHOICE = [
(True, "male"),
(False, "female"),
]
# 用户ID
id = models.CharField(max_length=30, primary_key=True, db_column="id")
# 用户名
name = models.CharField(max_length=30, unique=True)
# 密码
password = models.CharField(max_length=200)
# 年龄
age = models.IntegerField()
# 性别
sex = models.BooleanField(default=True, choices=SEX_CHOICE)
# 创建时间
create_time = models.DateTimeField(auto_now_add=True)
# 更新时间
update_time = models.DateTimeField(auto_now=True)
# 备注
remark = models.CharField(max_length=200, null=True)
# 在此我们假设一个用户只能有一个角色,但一个角色可以对应多个用户
user_role = models.ForeignKey("Role")
class Role(models.Model):
""" 角色模型类 """
# 角色ID
id = models.CharField(max_length=30, primary_key=True)
# 角色名称
name = models.CharField(max_length=30, unique=True)
# 角色类型
type = models.SmallIntegerField()
# 创建时间
create_time = models.DateTimeField(auto_now_add=True)
# 更新时间
update_time = models.DateTimeField(auto_now=True)
# 备注
remark = models.CharField(max_length=200, null=True)
修改默认数据库为MySQL
修改beardata/settings.py文件如下,
DATABASES = {
'default': {
# 'ENGINE': 'django.db.backends.sqlite3',
# 'NAME': os.path.join(BASE_DIR, 'db.sqlite3'),
'ENGINE': "django.db.backends.mysql",
'NAME': 'beardata_001',
'USER': 'beardata',
'PASSWORD': 'beardata',
'HOST': '127.0.0.1',
'PORT': 3306,
}
}
在beardata_sys/init.py中添加如下代码
import pymysql
pymysql.install_as_MySQLdb()
生成迁移文件并执行迁移,在这个过程中可能汇报如下错误
解决方式:找到虚拟环境路径下Django的安装包,并找到base.py文件,进行编辑
vim ./envs/beardata/lib/python3.5/site-packages/django/db/backends/mysql/base.py
注释掉如下代码
接着会出现如下错误
解决方式:找到虚拟环境路径下Django的安装包,并找到operations.py文件,进行编辑
vim ./envs/beardata/lib/python3.5/site-packages/django/db/backends/mysql/operations.py
将decode改为encode
重新执行迁移
查看数据库表结构
查看beardata_sys_user表结构
更多推荐
所有评论(0)