模型.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))