2013-08-23 108 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