2014-03-29 55 views
1

我有許多模塊,其中每個都有許多版本的安裝。序列化爲json嵌套的一對多(相對於多對一)

一拉:

class Module(Models.Model): 
    install = models.ForeignKey(Install) 

一個安裝有許多模塊。

我想序列化這整個集合到JSON結構。

我發現我可以使用wad of stuff serializer這樣連載:

serializers.serialize("json", Version.objects.all(), indent=4, 
         relations={'module':{'relations':('install',)}}) 

但是,這是由內而外開始(一個多到一個視圖 - 許多版本的一個模塊,但我想知道每個模塊有什麼版本)。我得到的版本的名單在頂層,每個版本呼喚它的模塊,所以每個模塊列出很多次:

[ 
    { 
     "pk": 1, 
     "model": "cmh_server.version", 
     "fields": { 
      "name": "v1", 
      "module": { 
       "pk": 1, 
       "model": "cmh_server.module", 
       "fields": { 
        "install": { 
         "pk": 1, 
         "model": "cmh_server.install", 
         "fields": { 
          "name": "CMBN" 
         } 
        }, 
        "name": "CMBN", 
       } 
      } 
     }, 
     "pk": 2, 
     "model": "cmh_server.version", 
     "fields": { 
      "name": "v1.1", 
      "module": { 
       "pk": 1, 
       "model": "cmh_server.module", 
       "fields": { 
        "install": { 
         "pk": 1, 
         "model": "cmh_server.install", 
         "fields": { 
          "name": "CMBN" 
         } 
        }, 
        "name": "CMBN", 
       } 
      } 
     } 
    } 
] 

看到相同的模塊是如何列出兩次。那是不對的」。

我想這樣說

serializers.serialize("json", Install.objects.all(), indent=4, 
         relations={'module':{'relations':('version',)}}) 

當然,因爲安裝模型沒有一個所謂的「模塊」字段不工作的。

回答

2

您可以嘗試使用django rest框架。

定義模塊的型號和版本模型的模型串行:

class VersionSerializer(serializers.ModelSerializer): 
    class Meta: 
     model = Version 

class ModuleSerializer(serializers.ModelSerializer): 
    versions = VersionSerializer(many=True) 
    class Meta: 
     model = Module 
     fields = ('id', ..... , 'versions') 

現在定義安裝模式串行器:

class InstallSerializer(serializers.ModelSerializer): 
    modules = ModuleSerializer(many=True) 
    class Meta: 
     model = Install 
     fields = ('id', ..... , 'modules') 

這將序列與所有模塊安裝數據對每個安裝以及所有版本,用於安裝中的每個模塊。

編輯:

我忘了提及這一點,相關模型的字段的名稱應該是相同的related_name的外鍵字段中的值。

例如,在模塊型號:

class Module(Models.Model): 
    install = models.ForeignKey(Install, related_name='modules') 

現在,您必須使用「模塊」作爲串行的字段的名稱。

+0

這看起來很有吸引力。主要的缺點似乎是,如果類本身被修改,這些seralizer類必須被修改,對嗎?我的意思是 - 字段列表將不得不手動更新? – GreenAsJade

+0

要在模型序列化程序中包含一個字段,該字段不是模型中的實際字段,您需要明確定義Meta類中的字段屬性。爲了避免列出模型序列化程序的實際字段,可以使用Model._meta.fields生成模型字段的名稱列表。這樣您就不必擔心手動更新fields屬性。 –

+0

我猜InstallSerializer中的模型應該是Install?當我嘗試'我= Install.objects.get(pk = 1); Installserializer(i).data'我得到「AttributeError:'安裝'對象沒有屬性'模塊' 」 – GreenAsJade