Django4.0 管理器-修改管理器的初始QuerySet

2022-03-16 18:04 更新

?Manager ?的基礎(chǔ) ?QuerySet ?會返回系統(tǒng)中所有的對象。例如,使用以下模型:

from django.db import models

class Book(models.Model):
    title = models.CharField(max_length=100)
    author = models.CharField(max_length=50)

語句 ?Book.objects.all()? 會返回數(shù)據(jù)庫中所有的書。
你可以通過重寫 ?Manager.get_queryset() ?方法來覆蓋 ?Manager ?的基礎(chǔ) ?QuerySet?。 ?get_queryset()? 返回的 ?QuerySet ?應(yīng)該包含你需要的屬性。
例如,以下模型有 兩個 ?Manager? —— 一個返回所有對象,另一個僅返回 Roald Dahl 寫的書:

# First, define the Manager subclass.
class DahlBookManager(models.Manager):
    def get_queryset(self):
        return super().get_queryset().filter(author='Roald Dahl')

# Then hook it into the Book model explicitly.
class Book(models.Model):
    title = models.CharField(max_length=100)
    author = models.CharField(max_length=50)

    objects = models.Manager() # The default manager.
    dahl_objects = DahlBookManager() # The Dahl-specific manager.

使用這個實例模型時, ?Book.objects.all()? 會返回數(shù)據(jù)庫中所有的書,而 ?Book.dahl_objects.all()? 僅返回 Roald Dahl 寫的書。
因為 ?get_queryset()? 返回一個 ?QuerySet ?對象,你可以在上面調(diào)用 ?filter()?, ?exclude()? 和其它的 ?QuerySet ?方法。所以,以下語句是等效的:

Book.dahl_objects.all()
Book.dahl_objects.filter(title='Matilda')
Book.dahl_objects.count()

本例同時介紹了另一個有趣的技巧:在一個模型中使用多個管理器。你可以為一個模型添加任意多個 ?Manager()?。為模型定義通用 "?filters?" 的非重復(fù)方式。
例如:

class AuthorManager(models.Manager):
    def get_queryset(self):
        return super().get_queryset().filter(role='A')

class EditorManager(models.Manager):
    def get_queryset(self):
        return super().get_queryset().filter(role='E')

class Person(models.Model):
    first_name = models.CharField(max_length=50)
    last_name = models.CharField(max_length=50)
    role = models.CharField(max_length=1, choices=[('A', _('Author')), ('E', _('Editor'))])
    people = models.Manager()
    authors = AuthorManager()
    editors = EditorManager()

本例允許你調(diào)用 ?Person.authors.all()?,?Person.editors.all()? 和 ?Person.people.all()?,返回符合期望的結(jié)果。


以上內(nèi)容是否對您有幫助:
在線筆記
App下載
App下載

掃描二維碼

下載編程獅App

公眾號
微信公眾號

編程獅公眾號