第十四周-第二节课
内嵌类Meta
通过一个内嵌类Meta来定义元数据, 元数据又被称为中介数据, 用于描述数据得数据.
简单地讲, Meta就是通过属性来描述model对象, 为其提供额外得功能.
-
abstract
将当前模型类转换成抽象类, 当进行migrate的时候会被忽略.
因为migrate是对实体表进行修改, 而抽象是一个虚的概念, 所以不存在实体.
-
app_label
指定当前model从属于哪个已经注册的应用
使用场景一般为应用只编写视图层来处理业务逻辑. 模型层统一由一个models模块来管理, 所以要区分所属应用
-
db_table
自定义表名, 如果不指定表名则默认为
应用名_模型名
第一种使用情况为目标表已经存在.
第二种为开发没有管理表的权限, 需要dba建表再开发.
第三种为规范数据库的表名命名, 而不是使用django默认的命名规范.
-
managed
默认为True, 如果为False, 当前migrate会忽略该模型.
- 虽然设置了managed为False, 但是如果没有主键的化, 依然会自动创建主键.
很多公司都会由专人DBA来管理数据库.
独立开发流程: 创建模型-> migrate
公司合作开发流程: dba建表->创建模型
-
ordering
设置排序字段, 默认排序规则为升序
-
-
表示降序ordering = ['-order_date'] ordering = ['-pub_date', 'author']
-
?
表示随机的意思ordering = ['?']
-
-
get_lastest_by
设置获取最后一条记录的排序规则
-
indexes
设置索引
class Meta: indexes = [ models.Index(fields=['last_name', 'first_name']), models.Index(fields=['first_name'], name='first_name_idx'), ]
-
unique_together
多字段唯一性约束
unique_together = ("driver", "restaurant")
模型继承
-
普通继承
class Person(models.Model): name = models.CharField(max_length=191) email = models.EmailField() update_time = models.DateTimeField(auto_now=True) create_time = models.DateTimeField(auto_now_add=True) null_test = models.CharField(max_length=200, null=True) blank_test = models.CharField(max_length=200, blank=True) class Meta: abstract = True class Reader(Person): whether_vip = models.BooleanField(default=False)
-
多重继承
如果当前模型对象没有指定主键, 那么django会自动帮我们创建名为id的主键字段.
为了解决多重继承产生的id冲突, 你需要覆盖id字段.
from django.db import models # Create your models here. class Student(models.Model): # db_column为数据库中的字段 student_id = models.AutoField(primary_key=True, db_column="id") name = models.CharField(max_length=200) class Book(models.Model): book_id = models.AutoField(primary_key=True, db_column="id") book_name = models.CharField(max_length=200) class BorrowRecord(Student, Book): _id = models.AutoField(primary_key=True, db_column="id") borrow_time = models.DateTimeField(auto_now_add=True)
实例方法
-
获取最新记录
get_lastest_by = ['id'] item = model.objects.latest()
-
自定义输出
def __str__(self): return f"id:{self.id}, {self.question_text}"
-
刷新当前记录
refresh_from_db
-
字段验证
比如EmailField调用clean_fields会验证当前格式是否正确
-
字段唯一性验证
# 在meta中设置唯一性字段 unique_together = ['name', 'email'] reader.validate_unique(exclude=['null_test', 'create_time', 'update_time', 'id'])