Django模型必须与四个可能的表之一具有一对一的关系

时间:2016-04-05 04:07:54

标签: python django database

我正在开发一个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或其他什么地方,能让我保护自己免受这个问题的影响吗?

或许我的模型应该以完全不同的方式构建?

干杯

1 个答案:

答案 0 :(得分:1)

免责声明:这可能不是一个完整的答案,但会提供一些指示来实现目标。

这可能比你想象的要复杂得多。

你能做的是

  • 为您拥有的类型创建基类 - TypeBase。添加项目类的外键
  • 为每种类型创建所需的子类 - class TypeA(TypeBase)
  • 使用django的ContenType并将其foreingn键添加到基础中。这用于确定特定对象的实例类型。 ContentType在类之间创建了松耦合。
  • 覆盖save()的{​​{1}}方法以正确设置类型。
  • 您可能需要添加更多方法,例如
    • get_type - 从TypeBase获取类型。
    • get_type_object - 从ContentType对象获取特定类型的对象。