首页>>后端>>Python->django查询集返回列表的过滤器有哪些(2023年最新分享)

django查询集返回列表的过滤器有哪些(2023年最新分享)

时间:2023-12-09 本站 点击:0

导读:很多朋友问到关于django查询集返回列表的过滤器有哪些的相关问题,本文首席CTO笔记就来为大家做个详细解答,供大家参考,希望对大家有所帮助!一起来看看吧!

关于django中使用源生的sql语句查询有多个参数要进行过滤的情况

事实上前端构建过程一般都是建立在前后分离基础上的,你要想让自己的构建过程清晰、简单和方便,请首先将自己的项目前后实现分离。当然这个有难度,所以你的这个场景并不是非常适合gruntjs通常的构建模式。 对应问题讲完,再给你一些建议。

django model的get和filter方法的区别

django的get和filter方法是django model常用到的,搞清楚两者的区别非常重要。

为了说明它们两者的区别定义2个models

class Student(models.Model):

name = models.CharField('姓名', max_length=20, default='')

age = models.CharField('年龄', max_length=20, default='')

class Book(models.Model):

student = models.ForeignKey(Student)

一.先说下django的get方法:

1django的get方法是从数据库的取得一个匹配的结果,返回一个对象,如果记录不存在的话,它会报错。

比如我数据库里有一条记录,记录的name的值是"Python"的话,我用student = Student.objects.get(name='老王python'),

返回的是一个记录对象,你可以通过student.__dict__来查看,它返回的是一个字典的形式,{'key':valeus},key是字段的名称,而values是值的内容。

而如果我用get方法来查询一个数据库里不存在的记录,程序会报错。

比如:student = Student.objects.get(name='老王'),你自己可以运行看下。

2如果你用django的get去取得关联表的数据的话,而关键表的数据如果多于2条的话也会报错。

比如我的student表里有一个记录:

id name age

1 python 24

book表:

id student_id

1 1

2 1

我用

student = Student.objects.get(name='python')

book = Book.objects.get(student)

它也会报错,因为book表有2条记录和student表相匹配。

二.再说下django filter:

1django的filter方法是从数据库的取得匹配的结果,返回一个对象列表,如果记录不存在的话,它会返回[]。

比如我数据库里有一条记录,记录的name的值是Python的话,我用student = Student.objects.filter(name='老王python')

它返回的student是一个对象的列表,可以看的出来student[0]和上面的get方式返回的student的结果是一样的。

Django中复杂的查询

在上面所有的例子中,我们构造的过滤器都只是将字段值与某个常量做比较。如果我们要对两个字段的值做比较,那该怎么做呢?

Django 提供 F() 来做这样的比较。F() 的实例可以在查询中引用字段,来比较同一个 model 实例中两个不同字段的值。

Django 支持 F() 对象之间以及 F() 对象和常数之间的加减乘除和取模的操作。

filter() 等方法中的关键字参数查询都是一起进行“AND” 的。 如果你需要执行更复杂的查询(例如OR 语句),你可以使用Q 对象。

from django.db.models import Q

Q(title__startswith='Py')

Q 对象可以使用 和| 操作符组合起来。当一个操作符在两个Q 对象上使用时,它产生一个新的Q 对象。

查询名字叫水浒传或者价格大于100的书

你可以组合 和| 操作符以及使用括号进行分组来编写任意复杂的Q 对象。同时,Q 对象可以使用~ 操作符取反,这允许组合正常的查询和取反(NOT) 查询:

查询函数可以混合使用Q 对象和关键字参数。所有提供给查询函数的参数(关键字参数或Q 对象)都将"AND”在一起。但是,如果出现Q 对象,它必须位于所有关键字参数的前面。例如:

查询名字叫水浒传与价格大于100的书

如何在Django管理外键过滤器list

将 list_filter 中的外键字段改为 foreign_key__related_fieldname 这种形式就可以了。 这种用法适用于 ForeignKey 及 ManyToManyField 。

Django的orm中get和filter的不同

首先对比下两个函数文档上的解释。

get

Returns the object matching the given lookup parameters, which should be in the format described in Field lookups.

get() raises MultipleObjectsReturned if more than one object was found. The MultipleObjectsReturned exception is an attribute of the model class.

get() raises a DoesNotExist exception if an object wasn’t found for the given parameters. This exception is also an attribute of the model class

filter

Returns a new QuerySet containing objects that do not match the given lookup parameters.

The lookup parameters (**kwargs) should be in the format described in Field lookups below. Multiple parameters are joined via AND in the underlying SQL statement, and the whole thing is enclosed in a NOT().

输入参数

get 的参数只能是model中定义的那些字段,只支持严格匹配

filter 的参数可以是字段,也可以是扩展的where查询关键字,如in,like等

返回值

get 返回值是一个定义的model对象

filter 返回值是一个新的QuerySet对象,然后可以对QuerySet在进行查询返回新的QuerySet对象,支持链式操作

QuerySet一个集合对象,可使用迭代或者遍历,切片等,但是不等于list类型(使用一定要注意)

异常

get 只有一条记录返回的时候才正常,也就说明get的查询字段必须是主键或者唯一约束的字段。当返回多条记录或者是没有找到记录的时候都会抛出异常

filter 有没有匹配的记录都可以

Django过滤器truncateword和slice的区别

truncate会在后面加省略号,一般用于文本太长的省略。

slice是对列表,实际是数据截取,一般用于数据做操作,当然后面没有.....

具体到你的truncateword,省略的是词,和截取字符串差距很大。

结语:以上就是首席CTO笔记为大家介绍的关于django查询集返回列表的过滤器有哪些的全部内容了,希望对大家有所帮助,如果你还想了解更多这方面的信息,记得收藏关注本站。


本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:/Python/20808.html