filter 这个函数前面都有介绍,可以在其中添加符合筛选条件,也可以通过链式的形式来操作。
但是链式执行的用法是 and 逻辑,如果想要用 or 逻辑,可以使用 Q() 用法来连用,前面也简单介绍过。
3、exclude()
这个函数与 filter() 函数功能相反,是排除符合条件的数据。
4、annotate()
annotate 这个单词的意思是 注释,在 Django 里的用法是,通过对数据进行处理,比如一个表达式,或者是通过外键引入一个新的数据字段,或者是聚合出来一个结果(比如平均值,综合等),会在每一条返回的数据里面新增一个前面表达式的结果作为一个新的字段返回。
比如我们获取 Blog 这个 model 的时候,Entry 作为它的外键关系,我们可以获取关联了某条 Blog 的 Entry 的数量,并且作为新的字段添加到 Blog 里一起返回,其操作如下:
对于 QuerySet 每次返回的结果,如果 Meta 里有 ordering 参数,使用见上一篇 Meta 的使用笔记,那么数据就会按照 ordering 的参数对数据进行排序后返回。
如果 Meta 里没有设置该参数,那么数据则会在有主键 id 的情况下按照 id 的顺序返回。
当然,我们也可以使用 order_by() 这个函数来对每一次搜索的数据进行排序的重写。 正序排序
比如我们想要对 Entry 这个 model 对于 pub_date 进行正序排序:
按照外键字段排序
比如 Entry 这个 model 需要按照外键 Blog 的 name 字段来排序,则通过外键字段+双下划线+排序字段来实现:
Entry.objects.order_by('blog__name')
复制代码
如果我们在查询 Entry 的时候直接根据外键字段,也就是 blog 来排序,Django 会使用 Blog,也就是外键的默认排序(即在 Blog 的 model 的 Meta 里设置的 ordering 来排序),如果外键没有定义默认排序,则会根据主键 id 来排序。
比如说,我们的 Blog model,如果没有在 Meta 里设置默认的 ordering,那么,下面的语句:
Entry.objects.order_by('blog')
复制代码
则会等价于:
Entry.objects.order_by('blog_id')
复制代码
如果在 Blog 的 model 的 Meta 里有设置 ordering=['name'],那么则等价于: