django filter是一个过滤器,相当于SQL的select * from where。 
filter返回一个QuerySet对象,还可以在该对象上继续进行django orm 该有的操作。 
有几点需要注意。我们以该链接的几个model尽心说明。 models链接 
如果我们刷选出Blog表中的name为pcf, tagline包含’django study’的博客。我们可以有这两种简单的filter使用方法。

>>>Blog.objects.filter(name='pcf', tagline__contains='django study')    # 方法一
>>>Blog.objects.filter(name='pcf').filter(tagline__contains='django study') # 方法二
  • 1
  • 2

当然我们还有其余的方法比如使用Q对象,还可以使用原生SQL。在这里简单列一下Q对象使用

>>>from django.db.models import Q
>>>Blog.objects.filter(Q(name='pcf')&Q(tagline__contains='django study'))
  • 1
  • 2

filter 在使用就是这么简单。具体可以参考文档 
本篇博客着重介绍filter在跨越多值的关联关系的使用情况时需要注意的地方。 
跨越多值的关联关系

当你基于ManyToManyField 或反向的ForeignKey 来过滤一个对象时,有两种不同种类的过滤器。考虑Blog/Entry 关联关系(Blog 和 Entry 是一对多的关系)。我们可能想找出headline为“Lennon” 或publish为’2008’年的Entry。或者我们可能想查询包headline为“Lennon” 的Entry以及published为’2008’的Entry。因为实际上有和单个Blog 相关联的多个Entry,所以这两个查询在某些场景下都是有可能并有意义的。

ManyToManyField 有类似的情况。例如,如果Entry 有一个ManyToManyField 叫做 tags,我们可能想找到tag 叫做“music” 和“bands” 的Entry,或者我们想找一个tag 名为“music” 且状态为“public”的Entry。

对于这两种情况,Django 有种一致的方法来处理filter() 调用。一个filter() 调用中的所有参数会同时应用以过滤出满足所有要求的记录。接下来的filter() 调用进一步限制对象集,但是对于多值关系,它们应用到与主模型关联的对象,而不是应用到前一个filter() 调用选择出来的对象。

这些听起来可能有点混乱,所以希望展示一个例子使它变得更清晰。选择所有包含同时满足两个条件的entry的blog,这两个条件是headline 包含Lennon 和发表时间是2008 (同一个entry 满足两个条件),我们的代码是:

>>>Blog.objects.filter(entry__headline__contains='Lennon',entry__pub_date__year=2008)
  • 1

从所有的blog模型实例中选择满足以下条件的blog实例:blog的enrty的headline属性值是“Lennon”,或者entry的发表时间是2008(两个条件至少满足一个,也可以同时满足),我们的代码是:

>>>Blog.objects.filter(entry__headline__contains='Lennon').filter(entry__pub_date__year=2008)
  • 1

假如只有一个blog 对象同时含有两种entries,其中一种headline 包含“Lennon”而另外一种发表时间是2008,但是没有发表在2008年且headline 包含“Lennon” 的entries。第一个查询不会返回任何blog,第二个查询将会返回一个blog。

在第二个例子中, 第一个filter 限定查询集中的blog 与headline 包含“Lennon” 的entry 关联。第二个filter 又 限定查询集中的blog ,这些blog关联的entry 的发表时间是2008。(译者注:难点在如何理解further这个词!)第二个filter 过滤出来的entry 与第一个filter 过滤出来的entry 可能相同也可能不同。每个filter 语句过滤的是Blog,而不是Entry。

exclude 的使用和filter相似。在跨越多值的关联关系也需要注意,详情可见相关文档

转载于:https://www.cnblogs.com/ExMan/p/9443519.html

关于Django ORM filter方法小结相关推荐

  1. django的get和filter方法的区别

    django的get和filter方法是django model常用到的,搞清楚两者的区别非常重要.为了说明它们两者的区别定义2个models: classStudent(models.Model): ...

  2. python中objects_python之django的objects.get和objects.filter方法

    为了说明它们两者的区别定义2个models class Student(models.Model): name = models.CharField('姓名', max_length=20, defa ...

  3. python全栈示例_Python全栈之路--Django ORM详解

    ORM:(在django中,根据代码中的类自动生成数据库的表也叫--code first) ORM:Object Relational Mapping(关系对象映射) 我们写的类表示数据库中的表 我们 ...

  4. Django ORM中原生JSONField的使用方法

    带你尝鲜Django最新版重要更新JSONField的使用 Django最新版v3.1的主要更新之一便是完善了对JSON数据存储的支持,新增models.JSONField和forms.JSONFie ...

  5. python 多关键字匹配_使用django的objects.filter()方法匹配多个关键字的方法

    介绍: 今天在使用django的时候忽然想用到,如何匹配多个关键字的操作,我们知道django有一个objects.filter()方法,我们可以通过如下一句代码实现匹配数据库中title包含key关 ...

  6. django get和filter方法的几点不同

    django的get和filter方法是django model常用到的,搞清楚两者的区别非常重要. 为了说明它们两者的区别定义2个models class Student(models.Model) ...

  7. Django ORM 常用的查询方法

    1.exact(SQl精确查找 =/is) class Article(models.Model):title = models.CharField(max_length=200)content = ...

  8. Django orm基本crud方法大全!!所有操作只看一篇文章就够了!!

    话不多说 直接上方法 这里用到的数据结构为 class something(models.Model):id = models.AutoField(primary_key=True) # id 会自动 ...

  9. Django ORM操作

    Django ORM操作 一般操作 看专业的官网文档,做专业的程序员! 必知必会13条 <1> all(): 查询所有结果<2> get(**kwargs): 返回与所给筛选条 ...

最新文章

  1. spring AspectJ的Execution详解
  2. 如何在php7.2/php7.3中安装mcrypt扩展?
  3. java思考笔记——遍历Map-key的几种方法
  4. mfc try catch 捕获并显示_你的异常捕获够优雅不?求你别只会try{...} catch{...}了
  5. Golang——单元测试testing
  6. Ghost 基于 Node.js 构建的开源博客平台
  7. 第一百一十二节,JavaScript浏览器检测
  8. 深度图补全-depth inpainting
  9. 马化腾:这个市场不是拼钱、拼流量,而是拼团队、拼使命感和危机感
  10. python自动发邮件富文本_Python自动化测试发送邮件太麻烦?!一起聊一聊 Python 发送邮件的3种方式...
  11. [再寄小读者之数学篇](2014-06-23 向量公式)
  12. 刚想起 一些净瓶分析
  13. 金武士ups电源故障情况类型分析及维修
  14. #第六章 曲率二维表达的拟合应用 ​一、四维时空曲率的二维几何表达
  15. Idea搜索的时候匹配不到,半角空格和全角空格的问题
  16. 来自ETH源码,手动生成以太坊钱包,ERC20标准钱包
  17. C语言笔记一:二进制补码
  18. Chrome插件:拦截页面请求
  19. GMT UTC CST ISO 夏令时 时间戳,都是些什么鬼?
  20. redmine备份_Bitnami Redmine备份方法

热门文章

  1. php分支结构有哪几种语句,PHP开发——分支结构
  2. error和warning指令
  3. labelImg标注工具(win10安装)
  4. 【java】矩阵的求解
  5. java exec waitfor,Java Process waitFor()方法与示例
  6. Java改环境变量把path修改了,CentOS查看和修改PATH环境变量的方法
  7. 语言压缩zip win_主流压缩软件挨个尝试后,我选择了没有短板的全能压缩Bandizip...
  8. 面试 AI 算法岗,项目实战与比赛经验到底能为你加成多少?
  9. 深度学习必备的几款流行网络与数据集
  10. oracle报27040错误,【oracle案例】创建表空间时遇到 ORA-01119,0RA-27040,0SD-04002