2009-12-17 65 views
0

这是我收到了(但意识到,你不能明显地做到这一点顺序如下:我应该如何建立这个Django的模型,做我想做的

class MasterAdmin(models.Model): 
    """ 
    A permanent admin (one per Account) that shouldn't be deleted. 
    """ 
    admin = models.OneToOneField(AccountAdmin) 

class Account(models.Model): 
    """ 
    A top-level account in the system. 
    """ 
    masteradmin = models.OneToOneField(MasterAdmin) 


class AccountAdmin(models.Model): 
    """ 
    An Account admin that can be deleted. This includes limited permissions. 
    """ 
    account = models.ForeignKey(Account) 

我想你可以看到我我想要有一个MasterAccountAdmin,它共享来自AccountAdmin的属性,目的是让人们能够删除一个AccountAdmin,但不是MasterAccountAdmin。我不想只拥有一个属性在AccountAdmin上调用“master = models.BooleanField()”。

显然这个例子不起作用,因为MasterAdmin引用了AccountAdmin befo重新创作,但我想展示我想要实现的目标。我是否认为这一切都错了?

+2

-1:真的问题题目很差。你能否确定题目是你真正的问题?也许“我如何定义三个循环引用的模型”或描述问题的东西。 – 2009-12-17 19:35:33

+0

这是一个体面的标题,如果你在阅读这个问题之前只关注代码。我不问如何从技术上实现我的代码所说的。我在问什么是编写模型的好方法(而不是我的方式)以实现我试图实现的高层次目标。 – orokusaki 2009-12-23 05:46:14

回答

3

为什么不让is_master成为AccountAdmin的一个属性,然后重写delete()方法以确保is_master不是真的?

+0

这是比OP更好的方法,但我想回答他有关前向引用的问题。 – cethegeek 2009-12-17 18:35:10

+0

哦,好点。我非常忙于架构,我没有看到这个问题(这也是我第一次在Django工作时遇到的一个问题)。 – Tom 2009-12-17 18:55:46

2

当您有前向引用时,请使用引号。

admin = models.OneToOneField('AccountAdmin') 

See the docs

如果你需要创建一个尚未被定义的模型的关系,您可以使用该模型,而不是模型对象本身的名称...

+0

谢谢!顺便说一句,这是非常pythonic做(这在引号事情)? – orokusaki 2009-12-17 18:28:40

+2

这是django的一个特殊功能,以适应这种关系。这是完全可以接受的做法,但它不被python明确支持。 – jcdyer 2009-12-17 18:32:00

+0

jcd说什么。我更新了我的答案以链接到文档。 – cethegeek 2009-12-17 18:33:12

相关问题