2011-09-04 68 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