我想在Django orm中做一些不寻常的事。
我有模型Car
。如何使用附加信息扩展它,按类型分隔,存储在另一个模型中?
例如,要输入Car
“我的卡车”,类型为truck
,我想用TruckInfo
模型扩展它。
另一个条目“我的巴士”我想用BusInfo
模型扩展。
换句话说,我想建立一个浮动的关系。
可以通过向Car
列添加类型,并执行SELECT
两次来实现:1)用于选择汽车,2)用于使用Car.Type字段选择额外信息。但这是一个可怕的解决方案。我想在一个查询中进行。
也许你在纯SQL中知道解决方案,它也会很有用。 THX。
答案 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