16多表设计[Python基础]

python

1.表设计

"""

BaseModel基表

is_delete、create_time、orders、updated_time

下面四表继承基表,可以继承两个字段

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

以上是 16多表设计[Python基础] 的全部内容, 来源链接: utcz.com/z/530348.html

回到顶部