前言:
通过项目projects的模型类对象,我们创建了几条数据,也通过接下来我们再通过interfaces模型类对象创建几条数据,方便后面进行过滤查询和表与表之间的关联查询
创建interfaces模型类对象的数据:
因为interfaces的表与projects的表有主从关系,所以我们创建从表数据时就需要设置从表interfaces表中关联父表projects中id的字段;
class InterfacesModel(BaseModel): id = models.IntegerField(primary_key=True, verbose_name="id主键", help_text="id主键") name = models.CharField(unique=True,max_length=200, verbose_name="接口名称", help_text="接口名称") tester = models.CharField(max_length=200, verbose_name="测试人员", help_text="测试人员") desc = models.CharField(max_length=200, verbose_name="简要描述", help_text="简要描述") # project = models.ForeignKey("projects.ProjectsModel", on_delete=models.CASCADE) project = models.ForeignKey(ProjectsModel, on_delete=models.CASCADE,related_name="interfaces")
- 说明:
- 可以使用ForeignKey来指定一对多的外键字段(例如接口表的project字段)
- 需要在“多”的那一侧添加外键字段
- 第一个必传参数需要添加关联的父表,有两种添加方式:
- 方式一,可以直接使用父表模型类
- 方式二,可以使用字符串(子应用名.父表模型类名)
- 第二个必传参数,需要on_delete指定删除父表记录时的子表该字段的处理方式
- CASCADE指定为当父表中某条记录删除之后,父表中这条记录所属的从表记录,会自动被删除
- SET_NULL指定为当父表中某条记录删除之后,父表中这条记录所属的从表记录,会自动设置为空,需同时设置null=True
- PROTECT指定为当父表中某条记录删除之后,会报错
- 数据表中,会创建名称为外键字段_id的字段名
备注:
- 如果从表的外键字段没有设置父表关联字段related_name属性名 ,则在通过父表查询从表记录时,需要调用 从表模型类名小写_set.字段名
- 如果从表的外键字段设置了父表关联字段related_name属性名 ,则在通过父表查询从表记录时,可以直接调用 外键字段属性名.字段名
反例:如果不传入project_id就会报错
报错信息:
django.db.utils.IntegrityError: NOT NULL constraint failed: tb_interfaces.project_id
方法一:
one_pro=ProjectsModel.objects.get(id=1)
one_inter=InterfacesModel.objects.create(name="接口1",tester="测试人",desc="这是一条接口1的描述",project=one_pro)
说明:
在创建从表数据时,直接给从表的外键传递父表模型类对象
方法二:
one_inter=InterfacesModel.objects.create(name="接口2",tester="测试人",desc="这是一条接口1的描述",project_id=1)
说明:
可以直接设置外键为project_id=父表主键id值
关联查询
通过从表参数查询父表数据
使用从表模型类名小写__从表字段名__过滤表达式
data_qs1=ProjectsModel.objects.filter(interfacesmodel__tester="测试人1") data_qs=ProjectsModel.objects.filter(interfacesmodel__tester__endswith="1") data_list = [] for obj in data_qs: data_dic = { "id": obj.id, "name": obj.name, "tester": obj.tester } data_list.append(data_dic) return JsonResponse(data_list, safe=False)
通过父表参数查询从变数据
方式一:
如果没有设置从表外键别名,父表模型类对象使用从表模型类名小写_set,可以获取子表的数据
data_qs=ProjectsModel.objects.filter(interfacesmodel__tester="测试人1") data_list = [] for obj in data_qs: data_dic = { "id": obj.interfacesmodel_set.id, "name": obj.interfacesmodel_set.name, "tester": obj.interfacesmodel_set.tester } data_list.append(data_dic) return JsonResponse(data_list, safe=False)
如果设置了从表外键属性名称related_name
方法:可以在子表模型类定义外键字段时,使用related_name指定父表获取子表数据的属性名称
从表模型类.py中设置外键属性名related_name
project = models.ForeignKey("projects.ProjectsModel", on_delete=models.CASCADE,related_name="interfaces")
视图集.py查询父表数据:
data_qs=ProjectsModel.objects.filter(interfacesmodel__tester="测试人1") data_list = [] for obj in data_qs: data_dic = { "id": obj.interfaces_set.id, "name": obj.interfaces.name, "tester": obj.interfaces.tester } data_list.append(data_dic) return JsonResponse(data_list, safe=False)
方式二:
使用父表模型类名小写__父表字段名__过滤表达式
data_qs = InterfacesModel.objects.filter(project__name__contains="项目") data_list = [] for obj in data_qs: data_dic = { "id": obj.id, "name": obj.name, "tester": obj.tester } data_list.append(data_dic) return JsonResponse(data_list, safe=False)