Django:双向一对一的关系。小鸡还是鸡蛋?

时间:2010-02-19 19:04:26

标签: django django-models

创建以下两个模型的实例的适当方法是什么

class Administrator(models.Model):
    user = models.OneToOneField(User, primary_key=True)
    account = models.ForeignKey(Account)

class Account(models.Model):
    owner = models.OneToOneField(Administrator)

两者都需要彼此。没有主要用户(owner)的帐户不能存在,并且没有帐户,管理员(owner是)不能存在。是的,一般的用户对象可以存在于它自己,但我不能围绕哪些应该首先以及如何正确实现它。如果我必须在管理员的帐户属性上使用blank = True,我会,但有更好的方法吗?我应该使用交易来确保一个交易不存在吗?

2 个答案:

答案 0 :(得分:4)

如果存在两个模型,每个模型都需要另一个模型,它们通常应合并为一个模型。

无论如何,可能有更好的方法来构建类。我个人会按如下方式构建一个UserProfile类:

class UserProfile(models.Model):
    user = models.OneToOneField(User)
    administrator = models.BooleanField()

或可能:

class UserProfile(models.Model):
    user = models.OneToOneField(User)

class AdministratorProfile(UserProfile):
    # attributes

甚至:

class UserProfile(models.Model):
    user = models.OneToOneField(User):

class AdministratorProfile(models.Model):
    profile = models.OneToOneField(UserProfile)

任何这些方法都应该有效。

答案 1 :(得分:0)

我不完全确定我完全理解AdministratorAccountcontrib.auth.User之间的差异,

这感觉就像 vs 有一个讨论。听起来Administrator是用户(实际上是用户档案,因为django特有的原因),而管理员有Account。账户没有任何东西,因为他们不能拥有和拥有。

这就像银行帐户与银行客户。银行客户拥有自己的账户,而不是相反。另一方面,银行账户有一个列表,该列表是可能使用该账户的银行客户。