2011-09-04 76 views
0

我想在Django orm中做一些不尋常的事情。我有型號Car。我怎樣才能用附加信息擴展它,按照類型分開存儲在另一個模型中?多種型號的額外信息

例如,要輸入Car「我的卡車」,其類型是truck,我想用TruckInfo模型擴展它。

另一個條目「我的公交車」我想擴展BusInfo模型。

換句話說,我想做一個浮動關係。

它可以通過添加到類型爲Car的列,並執行SELECT兩次來實現:1)用於選擇汽車,2)用於使用Car.Type字段選擇額外信息。但這是可怕的解決方案。我想在一個查詢中完成。

也許你知道純SQL中的解決方案,它也會有用。謝謝。

+1

看到這個:https://docs.djangoproject.com/en/dev/topics/db/models/#multi-table-繼承 –

+1

這個在SQL中定義超類型/子類型關係的答案:http://stackoverflow.com/questions/1722741/defining-a-one-to-one-relationship-in-sql-server/1723519#1723519 –

回答

1

如果您不想問批次更多關於您的特殊需求,這將是很難給你一個明確的答案。但是,Django的ORM中沒有任何東西阻止你這樣做。

這裏的做一個方式 - 請注意,我沒有以任何方式聲稱,它是唯一方式,如果給你的目標更多的澄清我可能會推薦別的東西:

class Automobile(models.Model): 
    [...] 
    type = models.ChoiceField(choices=(
     ('car', 'Car'), 
     ('truck', 'Truck'), 
     ('bus', 'Bus'), 
    )) 

    @property 
    def detail(self): 
     return getattr(self, self.type) 

class Car(Automobile): 
    [...] 

class Truck(Automobile): 
    [...] 

class Bus(Automobile): 
    [...] 

要確保,如果你走這條路,你想讀的多表繼承的文檔:https://docs.djangoproject.com/en/1.3/topics/db/models/#multi-table-inheritance

您也可能會或可能不希望頂級模型是一個實際的表(請參閱我給你的鏈接上面的文字討論抽象模型)。我不能告訴你要使用哪一個 - 它具體針對你想要做的事情。

您還可能需要一些自定義信號來強制執行數據準確性 - 例如,確保您沒有爲卡車類型的汽車保存總線記錄。

0

我想你也可以這樣做:

class Automobile(models.Model): 
    # ... 

class Truck(models.Model): 
    automobile = models.OneToOneField(Automobile, primary_key=True) 
    # ... 

class Bus(models.Model): 
    automobile = models.OneToOneField(Automobile, primary_key=True) 
    # ... 

幾點說明這裏:OneToOneField reference

,並與更多的細節的例子可以在這裏找到:One-to-one relationship example

+0

我認爲http://stackoverflow.com/questions/7301981/extra-info-for-model-with-several-types/7313375#7313375也是這樣做的,但以更原始的方式。 – Antigluk