2010-02-19 67 views
3

什么是创建以下两个型号Django:双向一对一关系。小鸡还是鸡蛋?

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,那么有没有更好的方法?我是否应该使用交易来确保没有其他交易的情况下不能存在?

回答

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) 

任何这些方法应该工作。

+0

+1用于使用用户配置文件(为此Django现在已内置支持)。 – jathanism 2010-02-19 19:33:09

+0

啊是的,然后添加'AUTH_PROFILE_MODULE ='appname.UserProfile''到你的设置文件,以便在用户实例上调用'get_profile()'。 – 2010-02-19 19:49:55

+0

你说得对。感谢今天所有的答案:)我认为这种方式(第二或第三个例子)是最好的,因为它是可扩展的。有一件事。你为什么不在用例子2中用UserProfile子类? – orokusaki 2010-02-20 02:07:43

0

我不能完全肯定我完全理解这种感觉就像是-A VS 有-一个讨论AdministratorAccountcontrib.auth.User

之间的差异。听起来像Administrator是一个用户(真的,UserProfile,由于django特有的原因),管理员有一个Account。账户没有任何东西,因为他们既不拥有也不拥有。

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