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() # 这个用例所在的全部集合

 

posted @ 2020-08-01 17:01  布谷鸟的春天  阅读(459)  评论(0编辑  收藏  举报