外键操作(非自关联类型)
定义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() # 这个用例所在的全部集合