我正在开发一个Django应用程序。我有一个表,其中一个列可以有四个值之一,并且根据该值,它必须与另一个具有特定于该值的列的表具有一对一的关系。
这是我的models.py:
from django.db import models
class Item(models.Model):
id = models.AutoField(primary_key=True)
type_choices = (
('A', 'Type A'),
('B', 'Type B'),
('C', 'Type C'),
('D', 'Type D'),
)
type = models.CharField(max_length=1, choices=type_choices)
class TypeA(models.Model):
item = models.OneToOneField(
Item,
primary_key=True,
)
# Type A specific fields
class TypeB(models.Model):
item = models.OneToOneField(
Item,
primary_key=True,
)
# Type B specific fields
class TypeC(models.Model):
item = models.OneToOneField(
Item,
primary_key=True,
)
# Type C specific fields
class TypeD(models.Model):
item = models.OneToOneField(
Item,
primary_key=True,
)
# Type D specific fields
因为没有什么能阻止我创建TypeA中的一行和TypeB中的一行,链接返回Item中的同一行(不我想要的东西)我是肯定会在某些时候搞砸了。
我能做些什么,在Django或其他什么地方,能让我保护自己免受这个问题的影响吗?
或许我的模型应该以完全不同的方式构建?
干杯
答案 0 :(得分:1)
免责声明:这可能不是一个完整的答案,但会提供一些指示来实现目标。
这可能比你想象的要复杂得多。
你能做的是
TypeBase
。添加项目类的外键class TypeA(TypeBase)
。ContenType
并将其foreingn键添加到基础中。这用于确定特定对象的实例类型。 ContentType
在类之间创建了松耦合。save()
的{{1}}方法以正确设置类型。TypeBase
获取类型。ContentType
对象获取特定类型的对象。