2014-11-05 192 views
-1

我正在嘗試構建一個非常通用的模型,它需要嵌套的靈活性。這是一個簡單的例子。相同類型的Django模型外鍵

Work      Symphony No.1 
    |_Work        |_Movement 1 
    | |_Work       | |_Allegro 
    | |_Work       | |_Largo 
    |         | 
    |_Work        |_Movement 2 
    |_Work        |_Poco Allegretto 

我希望我能做的事情拋出一個語法錯誤,因爲工作顯然還沒有定義它不能是一個ForeignKey。

class Work(models.Model): 
    work_name = models.CharField('Work Name', max_length=100) 
    work_parent = models.ForeignKey(Work) 

我想使用一個基類是這樣的:

class BaseWork(models.Model): 
    pass 

class Work(BaseWork): 
    name = models.CharField(max_length=100) 
    work_parent = models.ForeignKey(BaseWork) 

我相信,通過這樣做,我可以讓弗萊自己的爺爺這麼說,但有一個「正確」的方式去做這個?

+1

work_parent = models.ForeignKey('self')? – Seether 2014-11-05 12:50:23

+0

除此之外,我會問自己究竟想要達到什麼目的,因爲使用這樣的設計,你可能需要在其他地方實現一些其他的數據控制機制,因爲模型本身並不能幫助你阻止Fry他自己的祖父。 – Seether 2014-11-05 12:59:09

+0

'自我'似乎在工作,謝謝。 – asmacdo 2014-11-05 13:13:17

回答

1

謝謝@Seether。

class Work(BaseWork): 
    name = models.CharField(max_length=100) 
    work_parent = models.ForeignKey('self', null=True) 

我很好奇是否和爲什麼這將是不好的做法。當然,必須有很多模型需要嵌套嗎?他們是否對結構進行硬編碼?

+0

嚴格指代這段代碼,實際上我看不出有什麼不好的做法。我之前告訴你的是問自己你需要什麼嵌套的東西。請記住,它並不完全是你在這裏創建的嵌套,而更可能是_might_(null = True)條目鏈參考其他條目:(pk(1) - > pk(5),pk(2 ) - > null,pk(5) - > pk(1)...)。可以創建循環引用,但不一定。 – Seether 2014-11-05 14:02:54

+0

如果你在模型中談論_subclassing_,這絕對不是壞習慣,而且會是愚蠢的想法。每當你定義一個新模型時,只要考慮你繼承了'models.Model'。 – Seether 2014-11-05 14:05:43