books=Book.objects.all()
上面将查询结果赋值给了 books 变量,由于 QuerySet 是惰性加载,所以此时该语句并不会访问数据库,只有当 我们使用 books 的时候,才会访问数据库,获取相应的查询结果。我们可以通过 QuerySet 的 query 属性查看生成的 SQL 语句。如下所示:print(Book.objects.all().query)
打印结果如下所示:print(Book.objects.all().query) SELECT `index_book`.`id`, `index_book`.`title`, `index_book`.`price`, `index_book`.`retail_price`, `index_book`.`pub_id` FROM `index_book`
MyModel.objects.filter(属性1=值1, 属性2=值2)
filter 方法返回一个新的 QuerySet ,它包含了与筛选条件相匹配的所有对象。这些筛选条件,通过参数的形式传递给 filter 方法。filter 方法会将传递的参数转换成 WHERE 子句实现过滤查询。若是多个条件那么它们之间属于 and 关系。在没有查询条件的情况下,它的与 all 方法是等价的。条件查询关键字 | 代表含义 | SQL语句 |
---|---|---|
__gt | 大于 | select * from index_book where id>3; |
__gte | 大于等于 | select * from index_book where ids>=3; |
__lt | 小于 | select * from index_book where id<3; |
__lte | 小于等于 | select * from index_book where id<=3; |
__exact | 等于 | select * from index_book where id=4; |
__iexact | 忽略大小写的等于 | select * from index_book where name like 'flask'; |
__in | 是否在集合中 | select * from index_book where id in (2,8,11); |
__contains | 是否包含... | select * from index_book where title like "%T%"; |
__startswith | 以...开头 | select * from index_book where title like "P%"; |
Author.objects.filter(name__icontains='l')#icontains不对大小写敏感 # 等同于SQL语句 select * from author where name like '%l%' # 查找价格在某一区间内的所有书籍 Book.objects.filter(price__range=(20,45)) # 等同于SQL语句 select price where Book between 20 and 45;
In [2]: Book.objects.exclude(price__lt=40) #返回的结果是价格大于40的书籍 Out[2]: <QuerySet [<Book: Book object (1)>, <Book: Book object (3)>, <Book: Book object (4)>, <Book: Book object (5)>]>
In [3]: Book.objects.order_by("-title","price")#按照title逆序排序后再按正序排列 Out[3]: <QuerySet [<Book: Book object (6)>, <Book: Book object (2)>, <Book: Book object (1)>, <Book: Book object (3)>, <Book: Book object (5)>, <Book: Book object (4)>]>order_by 使用时有两种场景需要注意:
In [8]: Book.objects.values("id","title")#字典的键对应字段名,与其对应的值组成键值对 Out[8]: <QuerySet [{'id': 4, 'title': 'Django'}, {'id': 5, 'title': 'Flask'}, {'id': 3, 'title': 'Java'}, {'id': 1, 'title': 'Python'}, {'id': 2, 'title': 'Redis'}, {'id': 6, 'title': 'Tornado'}]>
In [10]: Book.objects.values_list("id","title","price") Out[10]: <QuerySet [(1, 'Python', Decimal('59.00')), (2, 'Redis', Decimal('25.00')), (3, 'Java', Decimal('45.00')), (4, 'Django', Decimal('65.00')), (5, 'Flask', Decimal('45.00')), (6, 'Tornado', Decimal('35.00'))]>
Book.objects.all()[:3] #返回新的QuerySet对象 <QuerySet [<Book: Book object (1)>, <Book: Book object (2)>, <Book: Book object (3)>]> Book.objects.all()[1:5:2]#带步长的切片,将返回Model实例列表 [<Book: Book object (2)>, <Book: Book object (4)>]切片后得到的 QuerySet 不能再执行其他操作,比如字段排序、过滤等。
利用 Python 的数组切片语法将 QuerySet 切成指定长度。这等价于 SQL 的 LIMIT 和 OFFSET 子句
本文链接:http://task.lmcjl.com/news/5610.html