如果我有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'
为什么会这样,我如何将经理传播到所有子类?
答案 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