django開發系列:QuerySet之objects對象

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))
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章