模型是 Django Web 框架中必不可少的一部分,它指定了数据的唯一来源即从对应的数据仓库中提取,不管是 SQLite、MySQL、还是 MongoDB。
模型继承 django.db.models.Model 这个 Python 的类。模型类的属性对应着数据库表单中的字段。Django 提供访问数据库的 API,操作的结果与数据库的操作命令结果相同。该部分内容了解即可,后续会在具体章节或项目案例中具体说明。
models 定义
定义个三国人物数据的模型,其中最重要的字段有名前、字等等信息。
from django.db import modelsclass Person(models.Model): name = models.CharField(max_length=10) character= models.CharField(max_length=10)相当于基于 MySQL 数据库构建一个表单。
CREATE TABLE AppName_Person( "id" serial NOT NULL PRIMARY KEY, "name" varchar(10) NOT NULL, "character" varchar(10) NOT NULL);models 配置
应用程序配置类(首选),或者包含应用程序的软件包。在 app 中定义好 models 需要在 settings.py 中应用,则需要进行如下操作。
INSTALLED_APPS = [ # 默认选项 'django.contrib.admin', # -- 管理员站点 'django.contrib.auth', # -- 认证授权系统 'django.contrib.contenttypes', # -- 内容类型框架 'django.contrib.sessions', # -- 会话框架 'django.contrib.messages', # -- 消息框架 'django.contrib.staticfiles', # -- 管理静态文件的框架 # 这里添加应用名称 'user', # 应用名称]向 INSTALLED_APPS 添加新的应用的时候,需要执行数据库迁移操作即。
python manage.py makemigrationspython manage.py migratemodels 字段
模型最重要且唯一需要的部分是定义的数据库字段列表。
字段名称不能是 API 相同的名称,例如 save、delete等等,也不能是 Python 的保留字,例如:pass、int等,并且建议用小写方式。
from django.db import modelsclass Person(models.Model): name = models.CharField(max_length=10) character= models.CharField(max_length=10)
models 字段类型&选项
Django 附带数十种内置字段类型,可以根据实际需求进行设置。这些是应用于系统使用者从系统中填充数据最低的数据验证要求。
同时也是数据库中列的数据类型。
定义的列数据类型是 CharField(max_length=10) 对应的是MySQL中的 Varchar(10) ,指定列的最大长度是10。
from django.db import modelsclass Person(models.Model): name = models.CharField(max_length=10) character= models.CharField(max_length=10)不同的字段类型中的选项也不一样,总体遵循着该数据类型进行设置。
models 表单关系
与众多数据库一样,Django 的 models 也可以存在内外键关联的关系,用于数据的填充以及验证等业务。
使用的方法就是 django.db.models.ForeignKey 。
一对多关系 ForeignKey,为每个国家的人物提供一个外键关联的关系。
from django.db import modelsclass Country(models.Model): name = models.CharField(max_length=10)class Person(models.Model): name = models.CharField(max_length=10) character= models.CharField(max_length=10) country = models.ForeignKey(Country, on_delete=models.CASCADE)多对多关系 ManyToManyField,记录每个人物从事服务过的国家,例如徐庶(蜀、魏)这样。
from django.db import modelsclass Country(models.Model): name = models.CharField(max_length=10)class Person(models.Model): name = models.CharField(max_length=10) character= models.CharField(max_length=10) country = models.ManyToManyField(Country)一对一关系 OneToOneField,相当于表单继承复用的关系,用途较少这里不举例。
models Meta选项
models 的 Meta 选项为模型提供了诸多数据库默认的设置选项,例如复数显示方式(verbose_name_plural )、排序选项 ( ordering)、数据库表名称 ( db_table) 等等。
from django.db import modelsclass Age(models.Model): age = models.IntegerField() class Meta: ordering = ["age"] verbose_name_plural = "age"models 属性和方法
模型属性Manager 是向 Django 模型提供数据库查询操作并用于从数据库中检索实例的接口。
如果未定义 Manager 则默认名称为 objects.,管理器只能通过模型类访问,而不是模型实例。
模型上自定义方法向对象添加自定义『行级』功能。可以对字符串进行不同方式的操作并进行模板的渲染操作。
自定义审核状态和不同状态字体颜色。
def status_code(self): color_code = [i[1] for i in CONTENT_STATUS_COLOUR if i[0] == self.status][0] status = [i[1] for i in CONTENT_STATUS_CHOICES if i[0] == self.status][0] return format_html( '<span style="color: {};">{}</span>', color_code, status, )status_code.short_description = '审核状态'
在这里插入图片描述
models 默认定义方法修改
在 Django Web 操作的时候,有时候保存表单需要进行某些数据的同步操作,就要使用到修改默认方法了。其中包括 save()、deleta() 等等。
from django.db import modelsclass Person(models.Model): name = models.CharField(max_length=10) character= models.CharField(max_length=10) country = models.ManyToManyField(Country) def save(self, *args, **kwargs): if 'xxxx' in self.name: super().save(*args, **kwargs) else: passmodels 继承
这个最常用的就是依托 Django 框架中最原始定义好的模型进行继承然后修改重写生成新的模型使用。
继承用户表单重新自定义操作。
from django.contrib.auth.models import AbstractUserclass UserProfile(AbstractUser): actual_name = models.CharField( max_length=10, verbose_name="用户姓名", help_text="真实姓名", null=True, blank=True, unique=False ) nick_name = models.CharField( max_length=20, verbose_name="用户昵称", help_text="昵称", null=True, blank=True, unique=False ) ger = models.CharField( max_length=9, verbose_name="用户性别", help_text="性别", choices=GER_CHOICES, default="未定义" ) ......