当前位置:网站首页>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
边栏推荐
- Sqlplus garbled code problem, find the solution
- ViewPager2和VIewPager的區別以及ViewPager2實現輪播圖
- PLC信号处理系列之开关量信号防抖FB
- CSDN salary increase technology - learn about the use of several common logic controllers of JMeter
- The difference between viewpager2 and viewpager and the implementation of viewpager2 in the rotation chart
- Oracle installation enhancements error
- 14th test
- The industrial chain of consumer Internet is actually very short. It only undertakes the role of docking and matchmaking between upstream and downstream platforms
- 运用tensorflow中的keras搭建卷积神经网络
- 基于智慧城市与储住分离数字家居模式垃圾处理方法
猜你喜欢
中国首款电音音频类“山野电音”数藏发售来了!
Dynamics 365online applicationuser creation method change
Pytest learning - dayone
Flex flexible layout
Esp8266 uses TF card and reads and writes data (based on Arduino)
农牧业未来发展蓝图--垂直农业+人造肉
CentOS installs JDK1.8 and mysql5 and 8 (the same command 58 in the second installation mode is common, opening access rights and changing passwords)
First issue of JS reverse tutorial
[4g/5g/6g topic foundation-146]: Interpretation of white paper on 6G overall vision and potential key technologies-1-overall vision
csdn涨薪技术-浅学Jmeter的几个常用的逻辑控制器使用
随机推荐
Future development blueprint of agriculture and animal husbandry -- vertical agriculture + artificial meat
根据热门面试题分析Android事件分发机制(一)
有没有大佬帮忙看看这个报错,有啥排查思路,oracle cdc 2.2.1 flink 1.14.4
中国首款电音音频类“山野电音”数藏发售来了!
csdn涨薪技术-浅学Jmeter的几个常用的逻辑控制器使用
[bw16 application] Anxin can realize mqtt communication with bw16 module / development board at instruction
Do you have a boss to help look at this error report and what troubleshooting ideas are there? Oracle CDC 2.2.1 flick 1.14.4
How to solve the problem of golang select mechanism and timeout
[4g/5g/6g topic foundation-146]: Interpretation of white paper on 6G overall vision and potential key technologies-1-overall vision
flink. CDC sqlserver. 可以再次写入sqlserver中么 有连接器的 dem
剑指 Offer II 107. 矩阵中的距离
Check the example of where the initialization is when C initializes the program
phpcms实现PC网站接入微信Native支付
Qualifying 3
用flinksql的方式 写进 sr的表,发现需要删除的数据没有删除,参照文档https://do
PLC信号处理系列之开关量信号防抖FB
Niuke - Huawei question bank (61~70)
Integer inversion
CDZSC_ 2022 winter vacation personal training match level 21 (2)
2016 CCPC Hangzhou Onsite