Django动态嵌入/嵌套模型

时间:2013-08-23 16:58:59

标签: python django

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

  • 将嵌入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这样的东西。

2 个答案:

答案 0 :(得分:1)

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

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

class EntityA(Entity):
    # unique attributes.

class EntityB(Entity):
    # unique attributes.

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