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