2

我有一个在创建时知道实体类型的应用程序。因此,我不知道如何正确链接相关模型,但我认为它像

  • 将类型嵌入到 json 字段中作为 Entity 的属性
  • 在“固定”表之间有一些关系(见下文)

e_type 字段是一个简单的 CharField,根据它的值,我查询 Type_a 或 Type_b。

这就是它现在在 django 中的样子

class Entity(models.Model):
   name = models.CharField(max_lenght=64)
   e_type = models.CharField(max_lenght=1)

class Type_a(models.Model):
   entity = models.OneToOneField(Entity)
   attribute = models.CharField(max_lenght=64)

class Type_b(models.Model):
   entity = models.OneToOneField(Entity)
   attribute = models.CharField(max_lenght=64)

你有什么建议?

谢谢

编辑:响应为什么有多个表 - 每个 e_type 裁判到不同的表结构。例如 type_a 有四个字段,type_b 有十个字段等等。拥有一个 json 字段很简单,因为它可以存储任何数据,因此不需要多个表,每个表都有自己的结构。我可以看到的另一种选择是使用 EAV 之类的东西。

4

2 回答 2

1

我不确定我是否正确解释了您的问题,但也许,使用继承,像这样......

class Entity(models.Model):
    name = models.CharField(max_length=64)
    # Other parent attributes.

class EntityA(Entity):
    # unique attributes.

class EntityB(Entity):
    # unique attributes.
于 2013-08-23T17:52:36.043 回答
0

我不确定我是否理解这个问题,但为什么你想要三个不同的表?我会推荐这样的东西:

#in models.py
class Entity(models.Model):
    TYPE_CHOICES = (('A', 'Type A'),
                ('B', 'Type B'))
    name = models.CharField(max_length=64)
    type = models.CharField(max_length=1, Choices=TYPE_CHOICES)
    attribute = models.CharField(max_length=64)

这具有以下优点:

  • 如果您使用模型表单,它们将自动生成,您的选择作为选项
  • 如果你以后需要一个新的选择,因为你有一个新的实体,你所要做的就是在 TYPE_CHOICES 元组中添加一个新的实体
  • 进行查询很容易。如果您想查找所有类型 A 的实体,您的查询很简单:Entity.objects.all().filter(type__eq='A')
于 2013-08-23T17:56:30.467 回答