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 功效

  1. 物理学上断掉关联提高搜索高效率
  2. 避免 环装表关联,造成 表关联变成死表(即不可以在实际操作表,假如要想在再次实际操作表 ,必须删库)

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
文章来源于网络 ,如有侵权请联系站长QQ61910465删除
本文版权归趣快排营销www.seoguRubloG.com 所有,如有转发请注明来出,竞价开户托管,seo优化请联系✚Qq61910465