W3Cschool
恭喜您成為首批注冊用戶
獲得88經(jīng)驗值獎勵
?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é)果。
Copyright©2021 w3cschool編程獅|閩ICP備15016281號-3|閩公網(wǎng)安備35020302033924號
違法和不良信息舉報電話:173-0602-2364|舉報郵箱:jubao@eeedong.com
掃描二維碼
下載編程獅App
編程獅公眾號
聯(lián)系方式:
更多建議: