【Django学习】(七)过滤表达式&关联查询

简介: 【Django学习】(七)过滤表达式&关联查询

前言:

通过项目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)

相关文章
|
1月前
|
IDE 关系型数据库 MySQL
Django学习一:创建Django框架,介绍Django的项目结构和开发逻辑。创建应用,编写主包和应用中的helloworld
这篇文章是关于如何创建一个Django框架,介绍Django的项目结构和开发逻辑,并指导如何创建应用和编写“Hello, World!”程序的教程。
38 3
Django学习一:创建Django框架,介绍Django的项目结构和开发逻辑。创建应用,编写主包和应用中的helloworld
|
1月前
|
SQL Java 数据库
Django学习三:views业务层中通过models对实体对象进行的增、删、改、查操作。
这篇文章是关于如何使用Django框架的ORM系统在视图(views)层面进行数据库的增、删、改、查操作的教程。
18 0
Django学习三:views业务层中通过models对实体对象进行的增、删、改、查操作。
|
1月前
|
关系型数据库 MySQL Java
Django学习二:配置mysql,创建model实例,自动创建数据库表,对mysql数据库表已经创建好的进行直接操作和实验。
这篇文章是关于如何使用Django框架配置MySQL数据库,创建模型实例,并自动或手动创建数据库表,以及对这些表进行操作的详细教程。
61 0
Django学习二:配置mysql,创建model实例,自动创建数据库表,对mysql数据库表已经创建好的进行直接操作和实验。
|
5月前
|
编解码 前端开发 JavaScript
技术经验分享:Django学习日记
技术经验分享:Django学习日记
|
1月前
|
SQL Go 数据库
【速存】深入理解Django ORM:编写高效的数据库查询
【速存】深入理解Django ORM:编写高效的数据库查询
58 0
|
1月前
|
SQL 前端开发 Python
基于python-django的neo4j人民的名义关系图谱查询系统
基于python-django的neo4j人民的名义关系图谱查询系统
32 0
|
4月前
|
SQL 数据库 Python
Django框架数据库ORM查询操作(6)
【7月更文挑战第6天】```markdown Django ORM常用数据库操作:1) 查询所有数据2) 根据ID查询 3) 精确查询 4) 分页排序
74 1
|
5月前
|
JSON 数据库 数据格式
使用 Django Q 对象构建复杂查询条件
通过本文示例,我们展示了如何使用Django的Q对象来构建复杂的查询条件,以及如何实现分页功能。Q对象的强大之处在于它能够轻松地组合多个查询条件,支持“与”、“或”关系,极大地提高了查询的灵活性和可读性。希望本文对你在实际项目中使用Django ORM构建复杂查询有所帮助。
|
5月前
|
存储 SQL 数据处理
Django ORM实战:模型字段与元选项配置,以及链式过滤与QF查询详解
Django ORM实战:模型字段与元选项配置,以及链式过滤与QF查询详解
|
5月前
|
前端开发 数据库 Python
Python Django项目下的分页和筛选查询
在Django中实现分页功能,视图函数通过`Paginator`处理数据,每页显示10条记录。URL配置支持带参数和不带参数的分页请求。前端模板使用for循环展示分页数据,包括商品信息和状态按钮,并利用分页组件导航。筛选查询视图根据GET请求的`state`参数过滤上架或下架产品,同样实现分页功能。前端添加状态选择下拉框,分页链接携带查询参数`state`确保筛选状态在翻页时保持。