当前位置:
首页 > temp > python入门教程 >
-
Python快速入门-16 多表设计
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
'''
(注意设置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, # 设置连表操作关系
)
本文作者:啦啦哦
本文链接:https://www.cnblogs.com/LYPZX/p/14076601.html
本文链接:https://www.cnblogs.com/LYPZX/p/14076601.html
最新更新
nodejs爬虫
Python正则表达式完全指南
爬取豆瓣Top250图书数据
shp 地图文件批量添加字段
爬虫小试牛刀(爬取学校通知公告)
【python基础】函数-初识函数
【python基础】函数-返回值
HTTP请求:requests模块基础使用必知必会
Python初学者友好丨详解参数传递类型
如何有效管理爬虫流量?
2个场景实例讲解GaussDB(DWS)基表统计信息估
常用的 SQL Server 关键字及其含义
动手分析SQL Server中的事务中使用的锁
openGauss内核分析:SQL by pass & 经典执行
一招教你如何高效批量导入与更新数据
天天写SQL,这些神奇的特性你知道吗?
openGauss内核分析:执行计划生成
[IM002]Navicat ODBC驱动器管理器 未发现数据
初入Sql Server 之 存储过程的简单使用
SQL Server -- 解决存储过程传入参数作为s
关于JS定时器的整理
JS中使用Promise.all控制所有的异步请求都完
js中字符串的方法
import-local执行流程与node模块路径解析流程
检测数据类型的四种方法
js中数组的方法,32种方法
前端操作方法
数据类型
window.localStorage.setItem 和 localStorage.setIte
如何完美解决前端数字计算精度丢失与数