2013-08-23 101 views
1

我有一个在创建时知道实体类型的应用程序。正因为如此,我不知道如何,但是我看它像Django动态嵌入/嵌套模型

  • 有类型嵌入到JSON场作为实体
  • 属性有“固定”表之间的某种关系正确链接的关联模型(参见下图)

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的东西。

+0

最后我带着一个json字段去了。我松开了内置的验证,但是我可以用不同的方法来验证数据。 – silviud

回答

1

我不知道如果我正确地解释你的问题,但也许,使用继承,像这样...

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

class EntityA(Entity): 
    # unique attributes. 

class EntityB(Entity): 
    # unique attributes. 
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')
+0

如果每种类型的实体都有独特的属性,那么我会在上面推荐Joseph的答案。 – Basti