• QuerySet API


    模型.objects:

      这个对象是django.db.models.manager.Manager的对象,这个类是一个空壳类,他上面的所有方法都是从QuerySet这个类上面拷贝过来的。因此我们只要学会了QuerySet,这`objects也就知道该如何使用。

    Manager 源码解析:

    class_name = "BaseManagerFromQuerSet"
    class_dict = {
       '_queryset_class': QuerySet        
    }
    class_dict.update(cls._get_queryset_methods(QuerySet))

    type动态的时候创建类。

      第一个参数是用来指定创建的类的名字。创建的类名是:BaseManagerFromQuerySet。

      第二个参数是用来指定这个类的父类。

      第三个参数是用来指定这个类的一些属性和方法

    return type(class_name,(cls,),class_dict)
    _get_queryset_methods:这个方法就是将QuerySet中的一些方法拷贝出来
    filter/exclude/annotate:过滤/排除满足条件的/给模型添加新的字段。

    order_by:

    # 根据创建的时间正序排序
    articles = Article.objects.order_by("create_time")
    # 根据创建的时间倒序排序
    articles = Article.objects.order_by("-create_time")
    # 根据作者的名字进行排序
    articles = Article.objects.order_by("author__name")
    # 首先根据创建的时间进行排序,如果时间相同,则根据作者的名字进行排序
    articles = Article.objects.order_by("create_time",'author__name')

    一定要注意的一点是,多个order_by,会把前面排序的规则给打乱,而使用后面的排序方式。比如以下代码:

    articles = Article.objects.order_by("create_time").order_by("author__name")

    他会根据作者的名字进行排序,而不是使用文章的创建时间。
    当然,也可以在模型定义的在`Meta`类中定义`ordering`来指定默认的排序方式。示例代码如下:

    class Meta:
            db_table = 'book_order'
            ordering = ['create_time','-price']

    还可以根据`annotate`定义的字段进行排序。比如要实现图书的销量进行排序,那么示例代码如下:

    ooks = Book.objects.annotate(order_nums=Count("bookorder")).order_by("-order_nums")
        for book in books:
            print('%s/%s'%(book.name,book.order_nums))
  • 相关阅读:
    Spark Streaming源码解读之Receiver生成全生命周期彻底研究和思考
    linux 修改时间时区,修改语言
    远程链接mysql error 2003
    Android NDK r10c 编译boost 1.55 (使用Cygwin)
    linux上cocos2dx Android打包环境
    linux上cocos2dx 环境配置
    linux, windows编译安装 boost库 (boost 1.56)
    编译安装 gcc 4.8.3
    vim配置添加python
    mvn设置
  • 原文地址:https://www.cnblogs.com/allwell/p/9459335.html
Copyright © 2020-2023  润新知