django开发系列:QuerySet之objects对象
模型.objects:
这个对象是django.db.models.manager.Manager
的对象,这个类是一个空壳类,他上面的所有方法都是从QuerySet
这个类上面拷贝过来的。因此我们只要学会了QuerySet
,这个objects
也就知道该如何使用了。
Manager
源码解析:
class_name = "BaseManagerFromQuerySet"
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
定义的字段进行排序。比如要实现图书的销量进行排序,那么示例代码如下:
books = Book.objects.annotate(order_nums=Count("bookorder")).order_by("-order_nums")
for book in books:
print('%s/%s'%(book.name,book.order_nums))