Django模型继承管理器吗?(我的似乎不)

5 投票
2 回答
3060 浏览
提问于 2025-04-15 20:29

我有两个模型:

class A(Model):
    #Some Fields
    objects = ClassAManager()

class B(A):
    #Some B-specific fields

我本来以为 B.objects 能让我访问到 ClassAManager 的一个实例,但事实并不是这样……

>>> A.objects
<app.managers.ClassAManager object at 0x103f8f290>
>>> B.objects
<django.db.models.manager.Manager object at 0x103f94790>

为什么 B 没有从 A 继承 objects 这个属性呢?

2 个回答

1

从Django 3.1开始,自定义管理器是从父类的抽象基类继承的。不过,有一个非常重要的注意事项——和普通类不同,子类不会自动有默认的objects管理器。你需要在父类的抽象基类上明确设置这个管理器。

举个例子,这样做是行不通的:

class AbstractBase(Model):
   # child fields come here

   custom_manager = MyCustomManager()

class Child(AbstractBase):
    # child fields come here
    pass

Child.objects.filter(id=1)

你会遇到这个错误:

> Traceback (most recent call last):
  File "<console>", line 1, in <module>
AttributeError: type object 'Child' has no attribute 'objects'

现在,Child类只有一个管理器custom_manager,这就成了它的默认管理器。如果你想让objects成为它的默认管理器,你就需要在父类的抽象基类上明确声明这个管理器。

from django.db.models import Manager, Model

class AbstractBase(Model):
   # child fields come here

   objects = Manager()
   custom_manager = MyCustomManager()
2

你的基础类需要是一个抽象基础类,这样自定义管理器才能被继承,具体的说明可以在这里找到。

撰写回答