Django之QuerySet详解

总结下QuerySet常用的操作函数:

1、filter() 将满足条件的数据提取出来
   取出id大于2 且 id不等于3 的图书
   books = Book.objects.filter(id__gte=2).filter(~Q(id=3))
 
2、exclude() 将满足条件的数据剔除
   books = Book.objects.filter(id__gte=2).exclude(id=3)
 
3、order_by() 将满足条件的数据进行排序
articles = Article.objects.filter(title='2').order_by('-create_time')
 
4、values(): 指定返回哪些字段,返回值是:字段和值形成的字典{"title":"xxx", "content":"xxx"}
(1)获取图书的id,name和作者表中的,作者名(Book和Author表外键连接)
    books = Book.objects.values("id", "name", "author__name") 
    =======>>想要给 作者名,换个名字
    books = Book.objects.values("id", "name", author_name=F("author__name"))
 
(2)获取每本书的销量(这里和annotate场景类似,感觉这样更好用一点)
    books = Book.objects.values("id", "name", sales=Count("bookorder__id"))
 
5、values_list(): 用法和values()一样,但是返回值是元组('xxx', 'xxx')
   books = Book.objects.values_list("name", flat=True)   =====>> 返回结果:红楼梦
   如果只指定一个字段,那么我们可以指定'flat=True',这样返回回来的结果就不再是一个元组,而是这个
字段的值,'flat=True'只能用在一个字段的情况下,否则会报错!!!
 
6、select_related():提取某个模型的数据的同时,也提前将相关联的数据提取出来(只能用在一对多或者一对一中)
获取图书的作者(Book和Author表外键连接)
(1)先得到图书表的所有数据,再 . 出作者(这个方法很耗性能,每 . 一下,就会执行一次查询语句)
books = Book.objects.all()
for book in books:
    print(book.author.name)
 
(2)查出图书表的所有信息和关联表中作者的所有信息,存储在内存中,再取时就直接从内存中去取,而不用再
执行sql语句,大大优化了性能
books = Book.objects.select_related("author")
for book in books:
    print(book.author.name)
 
7、prefetch_related():这个方法和select_related非常的类似,就是在访问多个表中的数据的时候,
减少查询的次数(只能用在多对一和多对多中)
(1)先查找出所有的图书信息 --> 再查出每本书的订单信息(每一次bookorder_set,都会执行一次查询语句)
# 先查找出所有的图书信息
books = Book.objects.all()
for book in books:
    # 再查出每本书的订单信息
    orders = book.bookorder_set.all()
    for order in orders:
        print(order.id)
 
(2)查找出所有的图书信息和查出每本书的订单信息存储在内存当中
books = Book.objects.prefetch_related("bookorder_set")
for book in books:
    orders = book.bookorder_set.all()
    for order in orders:
        print(order.id)
 
8、
defer 过滤掉指定的字段,返回值不是字典,而是模型
only  只提取指定的字段,返回值不是字典,而是模型
articles = Article.objects.defer("title")
articles = Article.objects.only("title")
 
9、
first() 获取第一条数据
last()  获取最后一条数据
 
10、exists 如果要判断某个条件的元素是否存在,那么建议使用exists
if Book.objects.filter(name__contains='红楼梦').exists():
    print(True)
比使用count更高效:
if Book.objects.filter(name__contains='红楼梦').count() > 0:
    print(True)
也比直接判断QuerySet更高效:
if Book.objects.filter(name__contains='红楼梦'):
    print(True)
 
11、distinct() :去除掉重复数据
提取所有销售的价格超过80元的图书,并且删掉那些重复的数据
books = Book.objects.filter(bookorder__price__gte=80).distinct()
 
12、QuerySet 切片操作
books = Book.objects.all()[1:3]
books = Book.objects.all()[1:3:2]   (第三个参数为步长)
 
 

你可能感兴趣的:(django)