当前位置: 首页 > news >正文

【Django】执行查询—跨关系查询中的跨多值关联问题

跨多值查询

跨越 ManyToManyField 或反查 ForeignKey (例如从 Blog 到 Entry )时,对多个属性进行过滤会产生这样的问题:是否要求每个属性都在同一个相关对象中重合。

filter()

先看filter(),通过一个例子看:

from datetime import datefrom django.db import modelsclass Blog(models.Model):name = models.CharField(max_length=100)tagline = models.TextField()def __str__(self):return self.nameclass Entry(models.Model):blog = models.ForeignKey(Blog, on_delete=models.CASCADE)headline = models.CharField(max_length=255)body_text = models.TextField()pub_date = models.DateField()# 其他字段省略...def __str__(self):return self.headline

假设Entry模型对应的表数据如下

Entry模型对应的表

# 要选择所有包含 2008 年至少一个标题中有 "Lennon" 的条目的博客(满足两个条件的同一条目)
>>> Blog.objects.filter(entry__headline__contains="Lennon", entry__pub_date__year=2008)
<QuerySet [<Blog: Beatles Blog>]>
# 要执行一个更为宽松的查询,选择任何只在标题中带有 "Lennon" 的条目和 2008 年的条目的博客
>>> Blog.objects.filter(entry__headline__contains="Lennon").filter(entry__pub_date__year=2008)
<QuerySet [<Blog: Beatles Blog>, <Blog: Beatles Blog>, <Blog: Pop Music Blog]>

这个结果看起来有点怪,官方文档的解释是由于第二个(更宽松的)查询链接了多个过滤器,它对主模型进行了多次连接,可能会产生重复的结果。
下面是其他网友的解释,可以参考

如果使用多个filter函数,单个函数接收单个条件,采用链式调用的方式来查询,则先过滤第一个查询条件,其返回的是QuerySet对象,注意:由于是跨关联关系查询,我们时刻要清除自己检索的是什么,这里我们检索的是Blog对象,而不是Entry对象,所以第一个过滤器返回的QuerySet内包含的也是Blog对象,而不是Entry对象。然后在此QuerySet基础上继续跨关联关系查询第二个过滤条件,如果返回的Blog对象关联的Entry对象中有满足过滤器条件的Entry,则将该Blog对象添加到返回的Queryset中
https://www.cnblogs.com/fu-9/p/14645330.html

exclude()

一次 exclude() 调用的条件并不需要指向同一项目。
还是用上面entry的数据。
例如,以下查询会排除那些 【关联条目标题包含"Lennon" 的博客】和【发布于 2008 年的博客】,查询结果是空:

>>> Blog.objects.exclude(
... 	entry__headline__contains="Lennon",
... 	entry__pub_date__year=2008,)
<QuerySet []>

如果要排除【关联条目标题包含"Lennon"且发布于2008年的博客】,查询结果是id为2的blog。

>>> Blog.objects.exclude(
...     entry__in=Entry.objects.filter(
...         headline__contains="Lennon",
...         pub_date__year=2008,
...     ),
... )
<QuerySet [<Blog: Pop Music Blog>]>
http://www.lryc.cn/news/308882.html

相关文章:

  • Spring八股 常见面试题
  • 今年面试潮,说实话这个开发岗能不能冲?
  • 【前端素材】推荐优质在线花卉商城电商网页Flowery平台模板(附源码)
  • ★【递归】【构造二叉树】Leetcode 106.从中序与后序遍历序列构造二叉树
  • linux检测和重启python脚本
  • HTML+CSS+JS:花瓣登录组件
  • Unity中URP下实现水体(水面反射)
  • 基于FastJson实现Json数据文件导入导出解析
  • JVM内存分配与垃圾收集流程
  • 【python】yaml转成json
  • css5定位
  • 【解决】修改 UI界面渲染层级 的常见误区
  • 蓝桥杯练习系统(算法训练)ALGO-995 24点
  • 汽车电子笔记:BootLoader升级过程疑难问题解决方式(Bootloader响应10 02 + 刷死拯救机制)
  • 高级RAG:揭秘PDF解析
  • Android之UI Automator框架源码分析(第九篇:UiDevice获取UiAutomation对象的过程分析)
  • 【C语言】指针初阶2.0版本
  • 小红书关键词爬虫
  • 网络爬虫的危害,如何有效的防止非法利用
  • 2024/2/29 备战蓝桥杯 6-1 二分
  • 浅析ARMv8体系结构:原子操作
  • 综合练习(二)
  • sql-labs第46关(order by盲注脚本)
  • 13款可以轻松上手画图软件推荐
  • vue实现商品评分效果(通过插件实现)
  • SpringBoot 手写 Starter
  • C++ 学习笔记(Structured bindings)
  • K8S常用kubectl命令汇总(持续更新中)
  • 加密和签名的区别及应用场景
  • 双非二本找实习前的准备day3