codecamp

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

Manager ​的基础 ​QuerySet ​会返回系统中所有的对象。例如,使用以下模型:

from django.db import models

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

语句 ​Book.objects.all()​ 会返回数据库中所有的书。
你可以通过重写 ​Manager.get_queryset() ​方法来覆盖 ​Manager ​的基础 ​QuerySet​。 ​get_queryset()​ 返回的 ​QuerySet ​应该包含你需要的属性。
例如,以下模型有 两个 ​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()​ 会返回数据库中所有的书,而 ​Book.dahl_objects.all()​ 仅返回 Roald Dahl 写的书。
因为 ​get_queryset()​ 返回一个 ​QuerySet ​对象,你可以在上面调用 ​filter()​, ​exclude()​ 和其它的 ​QuerySet ​方法。所以,以下语句是等效的:

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

本例同时介绍了另一个有趣的技巧:在一个模型中使用多个管理器。你可以为一个模型添加任意多个 ​Manager()​。为模型定义通用 "​filters​" 的非重复方式。
例如:

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

本例允许你调用 ​Person.authors.all()​,​Person.editors.all()​ 和 ​Person.people.all()​,返回符合期望的结果。


Django4.0 管理器-添加额外的管理器方法
Django4.0 管理器-默认管理器
温馨提示
下载编程狮App,免费阅读超1000+编程语言教程
取消
确定
目录

Django4.0 模型和数据库

Django4.0 处理HTTP请求

关闭

MIP.setData({ 'pageTheme' : getCookie('pageTheme') || {'day':true, 'night':false}, 'pageFontSize' : getCookie('pageFontSize') || 20 }); MIP.watch('pageTheme', function(newValue){ setCookie('pageTheme', JSON.stringify(newValue)) }); MIP.watch('pageFontSize', function(newValue){ setCookie('pageFontSize', newValue) }); function setCookie(name, value){ var days = 1; var exp = new Date(); exp.setTime(exp.getTime() + days*24*60*60*1000); document.cookie = name + '=' + value + ';expires=' + exp.toUTCString(); } function getCookie(name){ var reg = new RegExp('(^| )' + name + '=([^;]*)(;|$)'); return document.cookie.match(reg) ? JSON.parse(document.cookie.match(reg)[2]) : null; }