Django模型继承管理器吗?(我的似乎不)
我有两个模型:
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
你的基础类需要是一个抽象基础类,这样自定义管理器才能被继承,具体的说明可以在这里找到。