当前位置:网站首页>ORM模型--关联字段,抽象模型类
ORM模型--关联字段,抽象模型类
2022-07-07 07:17:00 【chuntian_tester】
1.关联字段
表与表之间的关系分为:
一对一关系:如学生表与学生详细信息表之间的关系,学生表中一个学生在学生信息表
中只有一条对应关系记录
一对多关系:如projects表与interfaces表之间的关系,项目表中的一个项目,在接口表
中可能有多个接口都属于此项目
多对多关系:如学生表与课程表的关系,学生表中一个学生可能选修了课程表里的多个
课程,课程表里的一个课程,也可能被学生表里的多个学生选择
1.1 创建interfaces子应用,并定义Interfaces模型类
1.1.1 项目根目录执行命令:python manage.py startapp interfaces
1.1.2 将interfaces子应用注册到setting.py中的INSTALLED_APPS中

1.1.2 interfaces/models.py中定义模型类Interfaces:
from django.db import models
class Interfaces(models.Model):
"""
1.如果创建一对多的关系,那么需要在'多'的那个模型类中定义models.ForeignKey()外键字段
1.1 models.ForeignKey()第一个参数为必传参数,指定需要关联的父表模型类:子应用名.模型类名,models.ForeignKey("projects.Projects")
1.2 也可直接将父模型类导入此文件后,直接使用父表模型类名:models.ForeignKey(Projects)
1.3 外键中的on_delete参数:
1.3.1 models.CASCADE:当主表记录删除时,从表记录跟着删除
1.3.2 models.SET_NULL:当主表记录删除时,从表记录自动设置为null
1.3.3 models.SET_DEFAULT:当主表记录删除时,从表记录自动设置为默认值,还需额外指定default=True
1.3.4 models.PROTECT:当主表记录删除时,如果有对应的从表数据,就会抛出异常
2.如果创建一对一的关系,可以在任意一个模型类中定义models.OneToOneField()
3.如果创建多对多的关系,可以在任意一个模型类中定义mmodels.ManyToManyField()
"""
id = models.AutoField(primary_key=True, verbose_name='id主键', help_text='id主键')
name = models.CharField(verbose_name='接口名称', help_text='接口名称', max_length=50)
tester = models.CharField(verbose_name='测试人员', help_text='测试人员', max_length=30)
create_time = models.DateTimeField(auto_now_add=True, verbose_name='创建时间', help_text='创建时间')
update_time = models.DateTimeField(auto_now=True, verbose_name='更新时间', help_text='更新时间')
# 设置外键
projects = models.ForeignKey('projects.Projects', on_delete=models.CASCADE,
verbose_name='所属项目', help_text='所属项目')
class Meta:
db_table = '接口表'
verbose_name = '接口表'
# 复数形式
verbose_name_plural = '接口表'
# ordering 定义排序的字段
ordering = ['id']
1.如果创建一对多的关系,那么需要在'多'的那个模型类中定义models.ForeignKey()外键字段
1.1 models.ForeignKey()第一个参数为必传参数,指定需要关联的父表模型类:子应用名.模型类名,models.ForeignKey("projects.Projects")
1.2 也可直接将父模型类导入此文件后,直接使用父表模型类名:models.ForeignKey(Projects)
1.3 外键中的on_delete参数:
1.3.1 models.CASCADE:当主表记录删除时,从表记录跟着删除
1.3.2 models.SET_NULL:当主表记录删除时,从表记录自动设置为null
1.3.3 models.SET_DEFAULT:当主表记录删除时,从表记录自动设置为默认值,还需额外指定default=True
1.3.4 models.PROTECT:当主表记录删除时,如果有对应的从表数据,就会抛出异常
2.如果创建一对一的关系,可以在任意一个模型类中定义models.OneToOneField()
3.如果创建多对多的关系,可以在任意一个模型类中定义mmodels.ManyToManyField()1.2 执行迁移
2.抽象模型类
上面的Interfaces模型类中定义了create_time和update_time,父表Projects也定义了这两个字段,所以我们可以在项目根目录中创建utils目录,在里面定义一些公共的模型类BaseModel,类似工具箱,这样在不同的子应用中都可以直接导入引用公共模型类
2.1 创建utils目录
2.2 定义公共模型类BaseModel
2.2.1 将BaseModel定义为抽象类,告诉ORM框架,这个类只用作被继承,在迁移时不
用创建对应的表:abstract= True

2.3 子应用中引用继承BaseModel

2.3 Interfaces子应用继承BaseModel公共模型类后精简为如下:
from django.db import models
from utils.base_model import BaseModel
# class Interfaces(models.Model):
class Interfaces(BaseModel):
"""
1.如果创建一对多的关系,那么需要在'多'的那个模型类中定义models.ForeignKey()外键字段
1.1 models.ForeignKey()第一个参数为必传参数,指定需要关联的父表模型类:子应用名.模型类名,models.ForeignKey("projects.Projects")
1.2 也可直接将父模型类导入此文件后,直接使用父表模型类名:models.ForeignKey(Projects)
1.3 外键中的on_delete参数:
1.3.1 models.CASCADE:当主表记录删除时,从表记录跟着删除
1.3.2 models.SET_NULL:当主表记录删除时,从表记录自动设置为null
1.3.3 models.SET_DEFAULT:当主表记录删除时,从表记录自动设置为默认值,还需额外指定default=True
1.3.4 models.PROTECT:当主表记录删除时,如果有对应的从表数据,就会抛出异常
2.如果创建一对一的关系,可以在任意一个模型类中定义models.OneToOneField()
3.如果创建多对多的关系,可以在任意一个模型类中定义mmodels.ManyToManyField()
"""
name = models.CharField(verbose_name='接口名称', help_text='接口名称', max_length=50)
tester = models.CharField(verbose_name='测试人员', help_text='测试人员', max_length=30)
# 设置外键
projects = models.ForeignKey('projects.Projects', on_delete=models.CASCADE,
verbose_name='所属项目', help_text='所属项目')
class Meta:
db_table = '接口表'
verbose_name = '接口表'
# 复数形式
verbose_name_plural = '接口表'
# ordering 定义排序的字段
ordering = ['id']
2.4 执行迁移脚本
python manage.py makemigrations projects interfaces
python manage.py migrate interfaces
python manage.py migrate projects

边栏推荐
- EXT2 file system
- thinkphp3.2信息泄露
- How to use Mongo shake to realize bidirectional synchronization of mongodb in shake database?
- 洛谷P2482 [SDOI2010]猪国杀
- Why are social portals rarely provided in real estate o2o applications?
- Check the example of where the initialization is when C initializes the program
- Please ask me a question. I started a synchronization task with SQL client. From Mysql to ADB, the historical data has been synchronized normally
- What development models did you know during the interview? Just read this one
- Internship log - day04
- HCIP 第一天 笔记整理
猜你喜欢

AI moves from perception to intelligent cognition

How does mongodb realize the creation and deletion of databases, the creation of deletion tables, and the addition, deletion, modification and query of data

Pytest learning - dayone

Esp8266 uses TF card and reads and writes data (based on Arduino)

内存==c语言1

Internship log - day07

Switching value signal anti shake FB of PLC signal processing series

“十二星座女神降临”全新活动推出

Future development blueprint of agriculture and animal husbandry -- vertical agriculture + artificial meat

【原创】程序员团队管理的核心是什么?
随机推荐
高斯消元
MongoDB创建一个隐式数据库用作练习
Write VBA in Excel, connect to Oracle and query the contents in the database
EXT2 file system
内存==c语言1
La différence entre viewpager 2 et viewpager et la mise en œuvre de la rotation viewpager 2
H5 web player easyplayer How does JS realize live video real-time recording?
Internship log - day04
iNFTnews | 时尚品牌将以什么方式进入元宇宙?
Gym - 102219J Kitchen Plates(暴力或拓扑序列)
Niuke - Huawei question bank (61~70)
How to become a senior digital IC Design Engineer (5-2) theory: ULP low power design technology (Part 1)
Introduction to automated testing framework
14th test
Software modeling and analysis
有没有大佬帮忙看看这个报错,有啥排查思路,oracle cdc 2.2.1 flink 1.14.4
Sword finger offer II 107 Distance in matrix
[bw16 application] Anxin can realize mqtt communication with bw16 module / development board at instruction
Bean 作⽤域和⽣命周期
Diffusion模型详解