模型是有关数据的唯一确定的信息源。 它包含你要存储的数据的基本字段和行为。 通常,每个模型都映射到单个数据库表。

特点
  1. 每个模型都是继承自 django.db.models.Model 的子类
  2. 模型中每个属性表示数据库中每个字段
  3. Django为我们提供了自动访问数据库的API
模型类属性定义

Django会为表创建自动增长的主键列,每个模型只能有一个主键列,如果使用选项设置某属性为主键列后Django不会再创建自动增长的主键列。
默认创建的主键列属性为id,可以使用pk代替,pk全拼为primary key。
属性定义规则:

  1. 不能是python的保留关键字
  2. 不允许使用连续的下划线,这是由django的查询方式决定的
  3. 定义属性时需要指定字段类型,通过字段类型的参数指定选项,格式如
    属性=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表结构
在这里插入图片描述

Logo

CSDN联合极客时间,共同打造面向开发者的精品内容学习社区,助力成长!

更多推荐