我有三个模型类:
django.contrib.auth.models.User
,改称为User
mysite.models.Profile
,改称为Profile
mysite.models.Subscriber
,改称为Subscriber
Profile
以well described的方式继承自User
,作为向User
模型添加自定义属性的解决方案,而无需使用可交换模型(仅限于在版本1.5中添加。)
虽然Profile
和Subscriber
是不同的对象,但它们确实共享一些属性。也就是说,我想以类似的方式使用自定义主键算法和覆盖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会不会发生冲突吗?
答案 0 :(得分:2)
您链接到的文档不描述通过多表继承从User继承。它确实解释了您可以使用OneToOneField链接类似对象的“配置文件”。尝试:
class Profile(BaseProfile):
user = models.OneToOneField(User, blank=True, null=True, on_delete=models.CASCADE)
...
我怀疑你实际上并不想要空白= True和null = True。
这种方法确实意味着您的User对象很可能与其对应的Profile对象没有相同的主键,但这对您来说可能没问题。