2009-12-17 50 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