有多种类型的模型的额外信息

时间:2011-09-04 20:39:40

标签: sql database django-models

我想在Django orm中做一些不寻常的事。

我有模型Car。如何使用附加信息扩展它,按类型分隔,存储在另一个模型中?

例如,要输入Car“我的卡车”,类型为truck,我想用TruckInfo模型扩展它。

另一个条目“我的巴士”我想用BusInfo模型扩展。

换句话说,我想建立一个浮动的关系。

可以通过向Car列添加类型,并执行SELECT两次来实现:1)用于选择汽车,2)用于使用Car.Type字段选择额外信息。但这是一个可怕的解决方案。我想在一个查询中进行。

也许你在纯SQL中知道解决方案,它也会很有用。 THX。

2 个答案:

答案 0 :(得分: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

您也可能希望顶层模型成为一个实际的表格(请参阅我给您的链接上面的文字,以便讨论抽象模型)。我不能告诉你使用哪个 - 它是针对你要做的事情。

您可能还需要一些能够提高数据准确性的自定义信号 - 例如,确保您不为卡车类型的汽车保存总线记录。

答案 1 :(得分: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