• ORM模型--关联字段,抽象模型类


    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:

    1. from django.db import models
    2. class Interfaces(models.Model):
    3. """
    4. 1.如果创建一对多的关系,那么需要在'多'的那个模型类中定义models.ForeignKey()外键字段
    5. 1.1 models.ForeignKey()第一个参数为必传参数,指定需要关联的父表模型类:子应用名.模型类名,models.ForeignKey("projects.Projects")
    6. 1.2 也可直接将父模型类导入此文件后,直接使用父表模型类名:models.ForeignKey(Projects)
    7. 1.3 外键中的on_delete参数:
    8. 1.3.1 models.CASCADE:当主表记录删除时,从表记录跟着删除
    9. 1.3.2 models.SET_NULL:当主表记录删除时,从表记录自动设置为null
    10. 1.3.3 models.SET_DEFAULT:当主表记录删除时,从表记录自动设置为默认值,还需额外指定default=True
    11. 1.3.4 models.PROTECT:当主表记录删除时,如果有对应的从表数据,就会抛出异常
    12. 2.如果创建一对一的关系,可以在任意一个模型类中定义models.OneToOneField()
    13. 3.如果创建多对多的关系,可以在任意一个模型类中定义mmodels.ManyToManyField()
    14. """
    15. id = models.AutoField(primary_key=True, verbose_name='id主键', help_text='id主键')
    16. name = models.CharField(verbose_name='接口名称', help_text='接口名称', max_length=50)
    17. tester = models.CharField(verbose_name='测试人员', help_text='测试人员', max_length=30)
    18. create_time = models.DateTimeField(auto_now_add=True, verbose_name='创建时间', help_text='创建时间')
    19. update_time = models.DateTimeField(auto_now=True, verbose_name='更新时间', help_text='更新时间')
    20. # 设置外键
    21. projects = models.ForeignKey('projects.Projects', on_delete=models.CASCADE,
    22. verbose_name='所属项目', help_text='所属项目')
    23. class Meta:
    24. db_table = '接口表'
    25. verbose_name = '接口表'
    26. # 复数形式
    27. verbose_name_plural = '接口表'
    28. # ordering 定义排序的字段
    29. 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公共模型类后精简为如下:

    1. from django.db import models
    2. from utils.base_model import BaseModel
    3. # class Interfaces(models.Model):
    4. class Interfaces(BaseModel):
    5. """
    6. 1.如果创建一对多的关系,那么需要在'多'的那个模型类中定义models.ForeignKey()外键字段
    7. 1.1 models.ForeignKey()第一个参数为必传参数,指定需要关联的父表模型类:子应用名.模型类名,models.ForeignKey("projects.Projects")
    8. 1.2 也可直接将父模型类导入此文件后,直接使用父表模型类名:models.ForeignKey(Projects)
    9. 1.3 外键中的on_delete参数:
    10. 1.3.1 models.CASCADE:当主表记录删除时,从表记录跟着删除
    11. 1.3.2 models.SET_NULL:当主表记录删除时,从表记录自动设置为null
    12. 1.3.3 models.SET_DEFAULT:当主表记录删除时,从表记录自动设置为默认值,还需额外指定default=True
    13. 1.3.4 models.PROTECT:当主表记录删除时,如果有对应的从表数据,就会抛出异常
    14. 2.如果创建一对一的关系,可以在任意一个模型类中定义models.OneToOneField()
    15. 3.如果创建多对多的关系,可以在任意一个模型类中定义mmodels.ManyToManyField()
    16. """
    17. name = models.CharField(verbose_name='接口名称', help_text='接口名称', max_length=50)
    18. tester = models.CharField(verbose_name='测试人员', help_text='测试人员', max_length=30)
    19. # 设置外键
    20. projects = models.ForeignKey('projects.Projects', on_delete=models.CASCADE,
    21. verbose_name='所属项目', help_text='所属项目')
    22. class Meta:
    23. db_table = '接口表'
    24. verbose_name = '接口表'
    25. # 复数形式
    26. verbose_name_plural = '接口表'
    27. # ordering 定义排序的字段
    28. ordering = ['id']

            2.4 执行迁移脚本

                    python manage.py makemigrations projects interfaces

                    python manage.py migrate interfaces

                    python manage.py migrate projects 

     

  • 相关阅读:
    LVGL---按钮(lv_btn)
    【Java】泛型方法
    Python 音频处理工具库之pydub使用详解
    JAVA笔记——Map集合常用API
    perforce 引擎启动报错,如何解决?
    基于javaweb+mysql的图书借阅管理系统(前台、后台)
    Linux计划任务
    计算机毕设 基于大数据的抖音短视频数据分析与可视化 - python 大数据 可视化
    EtherCAT从站EEPROM分类附加信息详解:TXPDO(输出过程数据对象)
    Linux基础(yum,vim,gcc,gdb)
  • 原文地址:https://blog.csdn.net/qq_40132294/article/details/125613744