5

我有 2 个模型:

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继承objects属性A

4

2 回答 2

2

您的基类需要是抽象基类才能继承自定义管理器,如此处所述

于 2010-03-16T19:21:12.290 回答
0

从 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类只有 1 个 manager custom_manager,它成为它的默认 manager。如果您想拥有objects它的默认管理器,那么您必须在父抽象基类上显式声明它。

from django.db.models import Manager, Model

class AbstractBase(Model):
   # child fields come here

   objects = Manager()
   custom_manager = MyCustomManager()
于 2020-09-29T12:00:09.417 回答