• Django学习笔记(18)ORM之外键操作


    外键操作(非自关联类型)

      定义User和Project表结构

    1 class User(BaseModel):
    2     '''用户表'''
    3     phone = models.CharField(verbose_name='手机号', max_length=11, unique=True)
    4     email = models.EmailField(verbose_name='邮箱', max_length=25, unique=True)
    5     password = models.CharField(verbose_name='密码', max_length=32)
    6     username = models.CharField(verbose_name='账号', max_length=20)
    1 class Project(BaseModel):
    2     '''项目表'''
    3     name = models.CharField(verbose_name='项目名', max_length=20, unique=True)
    4     desc = models.CharField(verbose_name='描述', max_length=200, null=True, blank=True)
    5     host = models.CharField(verbose_name='域名', max_length=1024)
    6     user = models.ForeignKey(User, on_delete=models.DO_NOTHING, db_constraint=False, verbose_name='创建者')

    表操作

     1 #Project表添加数据
     2 # user_obj = models.User.objects.get(id=1)
     3 # data = {
     4 #     "name":"外键练习",
     5 #     "desc":"描述",
     6 #     "host":"http://127.0.0.1:8000",
     7 #     "user":user_obj
     8 # }
     9 # models.Project.objects.create(**data)
    10 
    11 
    12 #外键查询
    13 # 正向:A表通过外键主动关联B表(A添加B外键),从A表开始查B表数据,则为正向,即project表添加了user表外键
    14 # 反向:A表通过外键主动关联B表,从B表开始查A表数据,则为反向,即user表被project通过外键关联
    15 # 简单记忆:从有ForeignKey定义的表查没ForeignKey定义的表数据,则为正向;反之,则为反向
    16 
    17 #正向查询,通过项目对象查询用户
    18 # project_obj = models.Project.objects.get(id=2)
    19 # print(project_obj.user.username)
    20 
    21 # 反向查询,通过用户反查项目
    22 # u_obj = models.User.objects.get(id=1)
    23 # print(u_obj.project_set.all()) # set用法:'小写表名'+'_set'
    24 
    25 
    26 #外键删除项目,由于models中on_delete=models.DO_NOTHING,db_constraint=False,所以项目和用户相互独立
    27 # models.Project.objects.get(id=2).delete()
    28 
    29 #反向删除,通过user反查,删除用户下所有的项目
    30 # u_obj = models.User.objects.get(id=1)
    31 # u_obj.project_set.all().delete()

    外键操作(自关联类型)

       用例表,A用例和B用例存在依赖关系,

      Case表结构

     1 class Case(BaseModel):
     2     '''用例表'''
     3     title = models.CharField(verbose_name='用例名称', max_length=20, unique=True)
     4     method_choice = (
     5         (1, 'POST'),
     6         (2, 'GET'),
     7         (3, 'DELETE'),
     8         (4, 'PUT')
     9     )
    10     method = models.SmallIntegerField(choices=method_choice, verbose_name='请求方式')
    11     cache_field = models.CharField(verbose_name='缓存字段', max_length=128, null=True, blank=True)
    12     check = models.CharField(verbose_name='校验点', max_length=512)
    13     params = models.CharField(verbose_name='请求参数', max_length=2048, null=True, blank=True)
    14     headers = models.CharField(verbose_name='请求头信息', max_length=2048, null=True, blank=True)
    15     is_json = models.BooleanField(verbose_name='参数是否是json', default=False)
    16     json = models.CharField(verbose_name='json类型参数', max_length=2048, null=True, blank=True)
    17     status_choice = (
    18         (1, '通过'),
    19         (2, '未运行'),
    20         (3, '运行中'),
    21         (999, '失败')
    22     )
    23     status = models.SmallIntegerField(choices=status_choice, verbose_name='用例状态',
    24                                       default=2)  # 记录上一次的状态,每次执行后需要更新这个表的字段
    25     report_batch = models.CharField(verbose_name='最后一次执行的批次号', null=True, max_length=512, blank=True)

      

    表操作

     1 #外键还有一种使用方式,自关联  自己和自己关联,比如:A用例和B用例关联,数据都在case表中
     2 #Case表创建case数据
     3 # data = {
     4 #     "title":"用例2",
     5 #     "method":"2",
     6 #     "check":"code=0",
     7 # }
     8 # models.Case.objects.create(**data)
     9 
    10 #创建自关联数据
    11 # models.CasePremise.objects.create(case_id=1,premise_case_id=2)#直接操作自关联表传入id即可
    12 
    13 #查询
    14 # case_obj = models.Case.objects.get(id=1)#获取id为1 的用例信息
    15 # #查出id为1的用例所依赖的用例信息
    16 # qs = case_obj.case.all()
    17 # #all()返回的是一个列表的queryset,case指CasePremise表(通过related_name='case'),即反向查询
    18 # for item in qs:
    19 #     #item 是CasePremise 依赖数据的对象
    20 #     print(item.case.title) #通过CasePremise表中的case外键关联到case表,再取title,即正向查询
    21 #     print(item.premise_case.id)

    多对多操作

      用例case表和用例集合表case_collection表存在多对多关系,case用例表上方已定义

      ManyToMany类型, Django会自动创建一张表case_collection_case表,存入用例id字段(case_id)和集合id字段(collection_id)

      用例集合case_collection表结构:

     1 class CaseCollection(BaseModel):
     2     '''用例集合'''
     3     name = models.CharField(verbose_name='集合名称', max_length=20, unique=True)
     4     desc = models.CharField(verbose_name='描述', max_length=200, null=True, blank=True)
     5     user = models.ForeignKey(User, on_delete=models.DO_NOTHING, db_constraint=False, verbose_name='创建者')
     6     project = models.ForeignKey(Project, on_delete=models.DO_NOTHING, db_constraint=False, verbose_name='归属项目')
     7     report_batch = models.CharField(verbose_name='最后一次执行的批次号', null=True, max_length=512, blank=True)
     8     status_choice = (
     9         (2, '未运行'),
    10         (3, '运行中'),
    11         (4, '执行完毕')
    12     )
    13     status = models.SmallIntegerField(choices=status_choice, verbose_name='用例状态',
    14                                       default=2)  # 记录上一次的状态,每次执行后需要更新这个表的字段
    15     case = models.ManyToManyField(Case, verbose_name='集合下的用例')

    表操作

     1 #多对多
     2 #   用例集合和用例是多对多关系
     3 #   A集合 和 B集合
     4 #   A用例 和 B用例
     5 #   A集合 --  A用例 B用例
     6 #   B集合 --  A用例 B用例
     7 #   ManyToMany
     8 
     9 # 先获取到用例集合和用例的信息
    10 case_obj_A = models.Case.objects.get(id=1) # 获取用例A
    11 case_obj_B = models.Case.objects.get(id=2) # 获取用例B
    12 coll_obj = models.CaseCollection.objects.get(id=1) # 获取集合
    13 
    14 # 通过集合中的case字段进行多对多的创建(实际就是向case_collection_case表添加数据)
    15 # add 可以接收用例的id,也可以是用例的对象
    16 coll_obj.case.add(case_obj_A)
    17 coll_obj.case.add(case_obj_B)
    18 
    19 # 删除多对多关系
    20 coll_obj.case.clear() # 清除集合有关的所有用例
    21 coll_obj.case.remove(1) # 清除集合和用例id为1的关系
    22 coll_obj.case.remove(case_obj_A) # 也支持 传入用例的对象
    23 
    24 #重置多对多关系
    25 coll_obj.case.set([1,2]) # 列表方式接受用例id,将用例id为1和2的和集合建立关系
    26 
    27 #查询多对多关系
    28 #正向查询
    29 coll_obj.case.all() # 获取这个集合的所有的用例
    30 
    31 #反向查询
    32 case_obj_A.casecollection_set.all() # 这个用例所在的全部集合
  • 相关阅读:
    在eclipse中进行Struts2项目的配置
    通过Java反射来理解泛型的本质
    Java动态加载类在功能模块开发中的作用
    让正常网页呈现黑白色调的方法
    养生-五谷:花生
    汉语-词语:男人
    地理-地点:白浮图镇
    地理-地点:鸡黍镇
    烹饪:杂粮
    烹饪:五谷
  • 原文地址:https://www.cnblogs.com/bugoobird/p/13414756.html
Copyright © 2020-2023  润新知