2012-07-30 38 views
0

這裏是什麼,我試圖做一個濃縮的例子:是否有可能在Django上爲子模型添加'through'模型?

class Entity(models.Model): 
    name = models.CharField(max_length=70) 

class Individual(models.Model): 
    first_name = models.CharField(max_length=30) 
    last_name = models.CharField(max_length=30) 

class BookingAgent(Entity) 
    staff = models.ManyToManyField(Individual, through='Role', related_name="employee") 

class Role(models.Model): 
    person = models.ForeignKey(Individual) 
    company = models.ForeignKey(Entity) 
    position = models.CharField(max_length=70) 

基本上,我有,叫Entity父類存儲所有的基本信息,公司即地址等,然後我有一個BookingAgent這是Entity的孩子。當我嘗試在BookingAgent模型上創建直通關係時,它不起作用。我得到錯誤:

'staff' is a manually-defined m2m relation through model Role, which does not have foreign keys to Individual and BookingAgent

但它在貫穿關係在實體模型中定義時起作用。

我的目標是讓每個實體都有一個員工或成員的個人名單。我想我明白爲什麼它不起作用,但我無法弄清楚一個優雅的解決方案。

謝謝!

UPDATE:澄清,實體是不是一個抽象基類,因爲會有一些實體是不BookingAgents,ManagementCompanies等

+0

*從技術角度,有什麼不對,你有什麼。如果'BookingAgent'是一個'Entity',那麼你應該可以將它保存到任何接受'Entity'的'ForeignKey'。然而,隨着Django建立M2M API的方式,這將不起作用。爲了使API正常工作,它必須將相關管理者連接到關係的兩個方面,即'Individual'和'BookingAgent',但是你的代碼會讓相關的管理者被添加到'Individual'和'Entity'。你可能會稱這是一個bug,但我想如果你提交了它,Django的開發者會將它標記爲WONTFIX。 – 2012-07-30 18:50:27

+0

謝謝@ChrisPratt!我擡頭看管理人員,但我仍然對如何解決這個問題感到困惑。你能澄清嗎? – 2012-07-30 19:29:22

+0

問題是我認爲你不能解決這個問題。您需要爲每個特定關係使用不同的「直通」模型。 – 2012-07-30 19:47:35

回答

0

我認爲你需要改變「RoleTest」到「角色」和你需要有一個外鍵BookingAgent,不Entity(且不應Entity是一個抽象基類?)

class BookingAgent(Entity) 
    staff = models.ManyToManyField(Individual, through='Role', related_name="employee") 

class Role(models.Model): 
    person = models.ForeignKey(Individual) 
    company = models.ForeignKey(BookingAgent) 
+0

謝謝! 「RoleTest」錯字只是在我這裏的問題。我不能將'外部代理'的外鍵用於'BookingAgent',因爲我也有'ManagementCompany'等。或者我應該爲每一個單獨制定一個'角色'模型? – 2012-07-30 18:00:34

+0

哎。這並不那麼簡單。您可以爲每個「Entity」的子類分別創建一個表。或者,您可以合併「Entity」的所有子類,併爲其指定一個「類型」字段,該字段將成爲「預訂代理」,「管理公司」等之一。或者,您可以使用Django的內容類型,無論型號。可能這些都不是理想的。 – scytale 2012-07-30 20:24:50

+0

感謝您的反饋。我的一些子類有不同的字段,所以不是將它們合併到「實體」中,而是採用通用關係路由。本教程幫助:[link](http://blog.yawd.eu/2011/admin-site-widget-generic-relations-django/) – 2012-07-31 14:45:35

相關問題