当前位置:网站首页>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
边栏推荐
- 剑指 Offer II 107. 矩阵中的距离
- csdn涨薪技术-浅学Jmeter的几个常用的逻辑控制器使用
- Why are social portals rarely provided in real estate o2o applications?
- sql 里面使用中文字符判断有问题,哪位遇到过?比如value<>`无`
- 【无标题】
- Qualifying 3
- Gym - 102219j kitchen plates (violent or topological sequence)
- How to use clipboard JS library implements copy and cut function
- 用flinksql的方式 写进 sr的表,发现需要删除的数据没有删除,参照文档https://do
- iNFTnews | 时尚品牌将以什么方式进入元宇宙?
猜你喜欢
Delete a record in the table in pl/sql by mistake, and the recovery method
Pytest learning - dayone
细说Mysql MVCC多版本控制
“十二星座女神降临”全新活动推出
字节跳动 Kitex 在森马电商场景的落地实践
Internship log - day04
Basic use of JMeter to proficiency (I) creation and testing of the first task thread from installation
Qualifying 3
Pit using BigDecimal
Performance optimization record of the company's product "yunzhujia"
随机推荐
Lesson 1: hardness of eggs
How to become a senior digital IC Design Engineer (5-2) theory: ULP low power design technology (Part 1)
哈夫曼编码压缩文件
Guys, have you ever encountered the case of losing data when Flink CDC reads mysqlbinlog? Every time the task restarts, there is a probability of losing data
用flinksql的方式 写进 sr的表,发现需要删除的数据没有删除,参照文档https://do
Gym - 102219J Kitchen Plates(暴力或拓扑序列)
一大波开源小抄来袭
网上可以开炒股账户吗安全吗
The combination of over clause and aggregate function in SQL Server
The applet realizes multi-level page switching back and forth, and supports sliding and clicking operations
Software modeling and analysis
Diffusion模型详解
Oracle installation enhancements error
How does mongodb realize the creation and deletion of databases, the creation of deletion tables, and the addition, deletion, modification and query of data
字节跳动 Kitex 在森马电商场景的落地实践
Luogu p2482 [sdoi2010] zhuguosha
Octopus future star won a reward of 250000 US dollars | Octopus accelerator 2022 summer entrepreneurship camp came to a successful conclusion
Database multi table Association query problem
农牧业未来发展蓝图--垂直农业+人造肉
有没有大佬帮忙看看这个报错,有啥排查思路,oracle cdc 2.2.1 flink 1.14.4