1.表设计方案
''' BaseModel基表 is_delete、create_time 、orders、updated_time 下边四表承继基表,能够承继2个字段名 Book表: name、price、img 、authors、publish is_delete、create_time 、orders、updated_time Publish表: name、address is_delete 、create_time、orders、updated_time Author表: name 、age is_delete、create_time、orders 、updated_time AuthorDetail表: mobile, author is_delete、create_time、orders、updated_time '''
2. 基表建立 (留意设定abstract = True)
from django.db import models class BaseModel(models.Model): """公共性实体模型""" orders = models.IntegerField(default=1, verbose_name="排列", help_text='排列') # 默认设置并不是删除 ,数据库查询中是0/1 is_delete = models.BooleanField(default=False, verbose_name="是不是删除", help_text='是不是删除') created_time = models.DateTimeField(auto_now_add=True, verbose_name="加上時间", help_text='加上時间') updated_time = models.DateTimeField(auto_now=True, verbose_name="修改时间", help_text='修改时间') class Meta: # 设定当今实体模型为抽象性实体模型,在数据备份转移的情况下django就不容易为它独立建立一张表 abstract = True # 申明该表仅仅一个抽象性表不出現在数据库查询中
3.断关联多表关联
db_constraint=False (设定了这一便是断关联,设定在外键,删除了作者详细信息 ,也不会删除作者)
3.1 功效
- 物理学上断掉关联提高搜索高效率
- 避免 环装表关联,造成 表关联变成死表(即不可以在实际操作表,假如要想在再次实际操作表 ,必须删库)
3.2 字段名设计方案
1 、外键部位: 一对多 -- 外键放到多的一方 一对一 —— 从逻辑性正反面向考虑到,如作者表与作者详细信息表,作者删除联级作者详细信息也删除 ,详细信息删除作者依然存有,因此 提议外键在 详细信息表 中 多对多 -- 外键在关联表中 2、ORM顺向方位连表搜索 顺向:根据外键字段名 eg:author_detial_obj.author # 外键设定在作者详细信息表,在作者详细信息表中查看作者立即 .author就可以 反方向:根据设定反方向查看related_name的值 eg:author_obj.detail #外键沒有设定在作者表中 ,在作者表中根据设定反方向查看.detail查看作者详细信息 3、连表实际操作关联(外键建在作者详细信息表中) 1)作者删除,详细信息联级 - on_delete=models.CASCADE #跟随一起删除 2)作者删除,详细信息置空 - null=True, on_delete=models.SET_NULL #外键字段名清除 3)作者删除 ,详细信息重设 - default=0, on_delete=models.SET_DEFAULT 4)作者删除,详细信息没动 - on_delete=models.DO_NOTHING
4.实体模型表设计方案
class BaseModel(models.Model): is_delete = models.BooleanField(default=False) # 默认设置并不是删除,数据库查询中是0/1 create_time = models.DateTimeField(auto_now_add=True, verbose_name='建立時间') # 设定 abstract = True 来申明基表,做为基表的Model不可以在数据库查询中产生相匹配的表 class Meta: abstract = True # 申明该表仅仅一个抽象性表不出現在数据库查询中 class Book(BaseModel): name = models.CharField(max_length=64) price = models.DecimalField(max_digits=5, decimal_places=2) img = models.ImageField(upload_to='img', default='img/default.jpg') # 关联作者表 authors = models.ManyToManyField( to='Author', db_constraint=True, # 断掉关联 related_name='books' # 反方向查看字段名 ) # 关联出版社出版表 publish = models.ForeignKey( to='Publish', # 关联publish表 db_constraint=False, # 断关联(断掉Book表和Publish表的关联,便捷删数据信息,尽管断掉了关联可是还能一切正常应用) related_name='books', # 反方向查看字段名:publish_obj.books就能查出来当今出版社出版出版发行的的全部书本 on_delete=models.DO_NOTHING, # 设定连表实际操作关联 ) @property def publish_name(self): return self.publish.name @property def authorlist(self): return self.authors.values('name', 'age', 'detail__mobile').all() class Meta: db_table = 'book' verbose_name = '书本' verbose_name_plural = verbose_name def __str__(self): return self.name # 出版社出版表 class Publish(BaseModel): name = models.CharField(max_length=64) addres = models.CharField(max_length=64) class Meta: db_table = 'publish' verbose_name = '出版社出版' verbose_name_plural = verbose_name def __str__(self): return self.name # 作者表 class Author(BaseModel): name = models.CharField(max_length=64) age = models.IntegerField() class Meta: db_table = 'author' verbose_name = '作者' verbose_name_plural = verbose_name def __str__(self): return self.name # 作者详细信息 class AuthorDetail(BaseModel): """mobile, author 、is_delete、create_time""" mobile = models.CharField(max_length=11) author = models.OneToOneField( to='Author', db_constraint=False, related_name='detail', on_delete=models.CASCADE ) class Meta: db_table = 'author_detail' verbose_name = '作者详细信息' verbose_name_plural = verbose_name def __str__(self): return self.author.name