LECODER之python :Django中的模型

126 阅读4分钟

一 、 在Django中创建模型

在前面的章节中我们提到过,模型对应的就是数据库中的表,创建好模型后,通过模型迁移,在数据库中创建对应的表。

1.1 继承自models类

首先模型类是被定义在"应用/models.py"文件中的,其次模型类必须基础自django.db.models类:

from django.db import models

1.2 表名

通过以下代码指定数据库表名:

class Meta:
    # 指定表名
    db_table = 'book_info'
    verbose_name = '图书'

如果在模型类中未指定表名,Django默认以"小写app应用名_小写模型类名"为数据库表名。

1.3 主键

Django会自动为生成的表创建一个自动增长的主键列,每个模型只能有一个主键列,如果使用选项设置某属性为主键列后,Django不会再自动创建主键列。

1.4 属性命名控制

通过以下代码创建一个BookInfo(书籍)模型和PersonInfo(书中角色)模型:

# Create your models here.
class BookInfo(models.Model):
    # 属性名 = 属性类型  CharField 必须设置max_length
    title = models.CharField(max_length=100,verbose_name='书名')
    author = models.CharField(max_length=100,verbose_name='作者')
    publisher = models.CharField(max_length=100,verbose_name='出版社')
    published = models.DateTimeField(verbose_name='发布日期',null=True)
    pages = models.IntegerField(default=0 , verbose_name='页数')
    readcount = models.IntegerField(default=0 ,verbose_name='阅读量')
    commentcount = models.IntegerField(default=0 ,verbose_name='评论量')

    class Meta:
        db_table = 'book_info'
        verbose_name = '图书'

    def __str__(self):
        """定义每个数据对象显示信息"""
        return self.name


# 书中角色
class PersonInfo(models.Model):
    GENDER_CHOICES = (
    (0,'male'),(1,'female'),(2,'other')
    )

    name = models.CharField(max_length= 20 , verbose_name='姓名')
    gender = models.SmallIntegerField(choices=GENDER_CHOICES,default=0 ,verbose_name='性别')
    description = models.CharField(max_length=200,null=True,verbose_name='描述信息')
    # 外键
    book = models.ForeignKey(BookInfo,on_delete=models.CASCADE,verbose_name='图书')
    is_delete = models.BooleanField(default=False,verbose_name='逻辑删除')

    class Meta:
        db_table = 'person_info'
        verbose_name = '人物信息'

    def __str__(self):
        return self.name

在前面的章节中,我们提到过,模型对应的是数据库中的表,而属性对应的就是表中的字段。 例如 :在BookInfo模型中,我们创建了title、author、publisher等字段,对应的就是表中一个个的字段。 定义属性时,使用下面的语法:

属性名 = models.字段类型(选项)

字段类型有以下几种:

  • AutoField : 自动增长的IntegerField,通常不用指定,不指定时Django会自动创建属性名为id的自动增长属性
  • BooleanField : 布尔字段,True/False
  • NullBooleanField : 支持Null、True、False
  • CharField: 字符串,参数max_length表示最大字符个数
  • TextField:大文本字段,一般超过4000个字符串时使用
  • IntegerField : 整数
  • DecimalField : 十进制浮点数, 参数max_digits表示总位数, 参数decimal_places表示小数位数
  • FloatField : 浮点数
  • DateField : 日期, 参数auto_now表示每次保存对象时,自动设置该字段为当前时间,用于"最后一次修改"的时间戳,它总是使用当前日期,默认为False; 参数auto_now_add表示当对象第一次被创建时自动设置当前时间,用于创建的时间戳,它总是使用当前日期,默认为False; 参数auto_now_add和auto_now是相互排斥的,组合将会发生错误
  • TimeField :时间,参数同DateField
  • **DateTimeField ** : 日期时间,参数同DateField
  • FileField : 上传文件字段
  • ImageField : 继承于FileField,对上传的内容进行校验,确保是有效的图片

选项有以下几种 :

  • null : 为True表示允许为空,默认值为False
  • blank :为True表示允许为空白,默认值为False
  • db_cloumn : 字段名称,如果未指定,使用属性名称
  • db_index : 为True在表中为此字段创建索引,默认值为False
  • default : 默认
  • primary_key : 为True,则该字段会成为模型的主键,默认值为False,一般作为AutoField的选项使用
  • unique : 为True表明该字段在表中必须有唯一值,默认值是False

1.5 外键

设置外键时,需要通过on_delete选项指明主表删除数据时,对于外键引用表数据如何处理,有下面三种常量分别代表了三种处理方式 :

  • CASCADE级联,删除主表数据时连通一起删除外键表中数据
  • PROTECT保护,通过抛出ProtectedError异常,来阻止删除主表中被外键应用的数据
  • SET_NULL设置为NULL,仅在该字段null=True允许为null时可用
  • SET_DEFAULT设置为默认值,仅在该字段设置了默认值时可用
  • SET() 设置为特定值或者调用特定方法
  • DO_NOTHING不做任何操作,如果数据库前置指明级联性,此选项会抛出IntegrityError异常

二、迁移

创建了模型后,就需要使用命令迁移了,在上一章中已经介绍过了:

  1. 生成迁移文件,这一步不会创建表
python manage.py makemigrations
  1. 在数据库中创建表
python manage.py migrate