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 断关联一定要通过逻辑保证表之间数据的安全,不要出现脏数据,通过代码控制

 

posted @ 2021-12-14 15:35  hushowee  阅读(193)  评论(0)    收藏  举报