Django-drf-模型表汇总
ORM
对象关系映射(Object Relational Mapping),简称orm
对于我们日常使用来说的作用:直接通过程序语言操作数据库,如通过python orm操作数据库,也方便了和程序语言之间的交互,毕竟程序语言和sql之间的沟通并不是同一种语言,我们自己去做处理比较麻烦,如果使用orm来操作的话,后续拿到的数据是对象,那么对其操作就很方便,因为Django提供了完整且好用的手段
抽象表
在models.py中,一个类就是一个表,若想创建抽象表,设置 abstract = True
1 # 每个表都要有这三个字段,所以提取出来,进行封装 2 class BaseModel(models.Model): 3 # 是否删除 4 is_delete = models.BooleanField(default=False) 5 # 创建时间,自动记录创建时间 6 create_time = models.DateTimeField(auto_now_add=True) 7 # 更新时间,自动记录更新时间 8 update_time = models.DateTimeField(auto_now=True) 9 10 # 这个表,并不希望它创建出来,所以设置为抽象表 11 class Meta: 12 abstract = True # 抽象表,不在数据库中创建表
表关系及创建表
表关系
总共4张表:图书表、出版社表、作者表、作者详情表
图书和出版社:一对多关系,一个出版社可以出版多本书,外键建在多的一方,即图书表中;
图书和作者表:一对多关系,一本书可以被多个作者出版,一个作者可以出版多本书,外键建在查询频率较高的一方,即图书表中;
作者和作者详情表:一对一关系,一个作者仅有一个作者详情,外键建在查询频率较高的一方,即作者表中。
图书表
class Book(BaseModel): title = models.CharField(max_length=21, verbose_name='书名') price = models.DecimalField(max_digits=5, decimal_places=2, verbose_name='价格')
# 外键部分 publish = models.ForeignKey(to='Publish', on_delete=models.DO_NOTHING, db_constraint=False) author = models.ManyToManyField(to='Author', db_constraint=False)
# Meta部分 class Meta: verbose_name_plural = '书籍表' # 在admin页面,显示中文表明
# 自定义方法部分 def __str__(self): return self.title @property # 将方法伪装成属性,用于在序列化类中调用,返回给前端一个便于阅读的文本,而不是一个id值 def publish_name(self): return self.publish.name # 通过列表生成式返回作者列表 @property def author_list(self): author_list = self.author.all() return [{'name': author.name, 'sex': author.get_sex_display()} for author in author_list]
出版社表
class Publish(BaseModel): name = models.CharField(max_length=32, verbose_name='出版社名') addr = models.CharField(max_length=32, verbose_name='出版社地址') class Meta: verbose_name_plural = '出版社表' def __str__(self): return self.name
作者表
class Author(BaseModel): name = models.CharField(max_length=32, verbose_name='作者姓名') sex = models.IntegerField(choices=((1, '男'), (2, '女')), verbose_name='性别') # 使用choice的话,里面写元组 class Meta: verbose_name_plural = '作者表' def __str__(self): return self.name # 和作者详情一对一,外键建在查询多 authordetail = models.OneToOneField(to='AuthorDetail', db_constraint=False, on_delete=models.CASCADE)
作者详情表
class AuthorDetail(BaseModel): mobile = models.CharField(max_length=11, verbose_name='手机号') class Meta: verbose_name_plural = '作者详情表' def __str__(self): return self.mobile
各部分说明
级联更新、级联删除
项目中,并不是所有的外键关联关系都要设置为级联删除,因为可能导致数据缺失。比如删除了一个作者,并不希望其对应的写的书都删除。所以on_delete有四种选择
1 # 作者没了 详情也没了 2 on_delete=models.CASCADE 3 4 # 出版社没了 书还是那个出版社出版 5 on_delete = models.DO_NOTHING 6 7 # 部门没了 员工没有部门(可以为空) 8 null = True,on_delete=models.SET_NULL
9 10 # 部门没了 员工进入默认部门(设置默认值) 11 default=0,on_delete = models.SET_DEFAULT
表断关系
表断关系(db_constraint = False)
1、表之间没有外键关联,但是有外键逻辑关联(有充当外键的字段)db_constraint=FALSE
2 断关联之后不会影响数据库查询效率,反而会极大提到数据库增删改效率(即,不影响增删改查操作)
3 断关联一定要通过逻辑保证表之间数据的安全,不要出现脏数据,通过代码控制
浙公网安备 33010602011771号