在Django中结合抽象模型类和多表继承

时间:2013-08-31 11:33:08

标签: python django multiple-inheritance

我有三个模型类:

django.contrib.auth.models.User,改称为User

mysite.models.Profile,改称为Profile

mysite.models.Subscriber,改称为Subscriber

Profilewell described的方式继承自User,作为向User模型添加自定义属性的解决方案,而无需使用可交换模型(仅限于在版本1.5中添加。)

虽然ProfileSubscriber是不同的对象,但它们确实共享一些属性。也就是说,我想以类似的方式使用自定义主键算法和覆盖save()方法,以便可以根据DRY重用代码。现在,如果两者都是普通的模型类,那很简单:

class BaseProfile(models.Model):
    key = models.PositiveIntegerField(primary_key=True)
    activated = models.BooleanField(default=False)
    ...

    class Meta:
        abstract = True

    def save():
        ...

class Profile(BaseProfile):
   ...

class Subscriber(BaseProfile):
   ...

但是,Profile已经使用了多表继承。我正在考虑类似的方式:

class BaseProfile(models.Model):
    key = models.PositiveIntegerField(primary_key=True)
    activated = models.BooleanField(default=False)
    ...

    class Meta:
        abstract = True

    def save():
        ...

class Profile(BaseProfile, User):
    user = models.OneToOneField(User, parent_link=True, blank=True, null=True, on_delete=models.CASCADE)
    ...

class Subscriber(BaseProfile):
   ...

这可能吗?如果是这样,在我的情况下需要什么样的继承顺序,以便以正确的方式调用模型字段和save()方法?两个模型类的Meta会不会发生冲突吗?

1 个答案:

答案 0 :(得分:2)

您链接到的文档不描述通过多表继承从User继承。它确实解释了您可以使用OneToOneField链接类似对象的“配置文件”。尝试:

class Profile(BaseProfile):
    user = models.OneToOneField(User, blank=True, null=True, on_delete=models.CASCADE)
    ...

我怀疑你实际上并不想要空白= True和null = True。

这种方法确实意味着您的User对象很可能与其对应的Profile对象没有相同的主键,但这对您来说可能没问题。