赞
踩
我们之前的增删改查操作等都会写类似如下的语句(xxx代表着filter,get等)
book = Book.objects.xxx
那么究竟这个objects是什么呢,为什么做操作前都需要加上这个objects
首先我们来打印一下这个objects
# views.py
def objects(request):
book = Book.objects
print(book)
print(type(book))
return HttpResponse('objects')
打印结果:
book.Book.objects
<class ‘django.db.models.manager.Manager’>
查看Manage类
可以看到它继承了一个from_queryset(QuerySet))的对象
查看from_queryset
可以看到当我们传了一个参数时,它返回的是一个新的类型(注:type()如果传递三个参数会返回一个新的类型)。它获取了这个参数里面的所有方法(_get_queryset_methods从字面上理解就是获取方法,功能也是如此)
最后来看QuerySet
(由于源代码太长不方便截,这里就只说明一下)查看源代码可以发现,QuerySet这个类里面封装的方法都是我们操作数据库的方法,诸如get,filter等。
综上,不难理解,objects是一个获取了QuerySet类里面所有方法的Manager对象。而我们用objects是源于方便。
在上面我们简单了解了objects,知道objects获取的是QuerySet类里面的方法,那么接下来我们了解一下这些方法
# 排除name是xxx的数据
book = Book.objects.exlude(name='xxx')
book = Book.objects.create(name='xxx')
book = Book.objects.get_or_create(name='xxx')
values:返回所需字段
values在查询数据时推荐使用,它优化了数据库的查询,减少不必要的数据查询,它在数据集合里以字典的形式存在
values_list:和values相同,只不过它在数据集合里是元组的形式
# 只返回所有数据的name字段
book = Book.objects.values('name')
# 返回name是xxx的price字段,values放在filter的前面和后面都可以
# book = Book.objects.filter(name='xxx').values('price')
book = Book.objects.filter(name='xxx').exists()
# 从第一条开始,向下获取两条价格低于100的书籍
book = Book.objects.filter(price__lte=100)[1:3]
转化的SQL语句:
SELECT `book`.`id`, `book`.`name`, `book`.`price` FROM `book` WHERE `book`.`price` <= 100.0 LIMIT 2 OFFSET 1
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。