子类化django模型不带有管理器

时间:2014-07-27 21:29:03

标签: python django django-models

如果我有Django模型:

class Person(models.Model):
    name = models.CharField(max_length=45)
    surname = models.CharField(max_length=45)
    objects = PersonManager()

及其经理:

class PersonManager(models.Manager):

    def create_person(self, fullname):

        name, surname = fullname.split(" ", 1)
        return self.create(name=name, surname=surname)

扩展该课程:

class Actor(Person):
    pass

没有相同的经理对象,但是默认的经理对象。

In [5]: Person.objects.create_person
Out[5]: <bound method PersonManager.create_person of <xxx.PersonManager object at 0x10297d190>>

In [6]: Actor.objects.create_person
---------------------------------------------------------------------------
AttributeError                            Traceback (most recent call last)
<ipython-input-6-468f84e48664> in <module>()
----> 1 Actor.objects.create_person

AttributeError: 'Manager' object has no attribute 'create_person'

为什么会这样,我如何将经理传播到所有子类?

1 个答案:

答案 0 :(得分:1)

您可以在此处详细了解:https://docs.djangoproject.com/en/dev/topics/db/managers/#custom-managers-and-model-inheritance

基本上管理者不是继承的(来自普通模型)。为了解决这个问题,您可以在每个应该使用PersonManager的模型中手动声明管理器。或者你可以使Person成为一个抽象模型,这样所有子类都将继承PersonManager。考虑到您可能想要添加董事,生产商或技术人员,这可能是最佳选择。为此,您将抽象属性添加到Persons元类。

class Person(models.Model):
    name = models.CharField(max_length=45)
    surname = models.CharField(max_length=45)
    objects = PersonManager()

    class Meta:
        abstract = True