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))

猜你喜欢

转载自www.cnblogs.com/allwell/p/9459335.html