zoukankan      html  css  js  c++  java
  • QuerySet 常用函数详解

    source: https://blog.csdn.net/qq_33867131/article/details/82754778
    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] (第三个参数为步长)

  • 相关阅读:
    ZOJ 1060 Count the Color
    POJ 3321 Apple Tree
    数字三角形模型
    静态维护区间加等差数列的求和问题
    Codeforces Round #622 (Div. 2)-题解
    算法竞赛进阶指南0x00-算法基础
    Codeforces Round #628 (Div. 2)
    Codeforces Round #625 (Div. 2, based on Technocup 2020 Final Round)
    Codeforces Round #621 (Div. 1 + Div. 2)
    Codeforces Round #620 (Div. 2) 题解
  • 原文地址:https://www.cnblogs.com/lab-zj/p/12894255.html
Copyright © 2011-2022 走看看