1

我遇到以下問題。我需要使用在json中發佈的數據創建一個複雜的對象。在models.py文件,我有一個名爲「公司」的主要對象:Django - 如何將json反序列化爲嵌套對象

class Company(models.Model): 
    name = models.CharField(max_length=255) 
    descr = models.CharField(max_length=255) 

    def __str__(self): 
     return self.name 

然後,我有「樓」:

class Building(models.Model): 
    name = models.CharField(max_length=255) 
    city = models.CharField(max_length=255) 
    location = models.TextField() 
    company= models.ForeignKey("Company", related_name="buildings", on_delete=models.CASCADE) 
與其他幾類

等等(即「落地」 ,「區域」,「房間」)。

我從POST請求得到的JSON是:

{ 
    "id": 1, 
    "buildings": [{ 
     "id": 3, 
     "floors": [{ 
      "id": 1, 
      "floor": -1, 
      "descr": "underground", 
      "building": 3 
     }], 
     "areas": [{ 
      "id": 1, 
      "rooms": [{ 
       "id": 1, 
       "floor": 1, 
       "area": 1, 
       "descr": "First Room" 
      }], 
      "descr": "Dev area", 
      "building": { 
       "id": 3, 
       "name": "Sede", 
       "city": "Rome", 
       "location": "mylocation", 
       "company": { 
        "id": 1, 
        "name": "Test", 
        "descr": "Test" 
       } 
      } 
     }], 
     "name": "Sede", 
     "city": "Rome", 
     "location": "mylocation", 
     "company": 1 
    }], 
    "name": "Test", 
    "descr": "Test" 
} 

當我嘗試創建從JSON,我收到了「公司」的對象,它不僅創造了以下內容:

{ 
    "id": 1, 
    "buildings": [], 
    "name": "Test", 
    "descr": "Test" 
} 

而不是完整的結構。

我的序列化有以下幾種:

class BuildingSerializer(serializers.ModelSerializer): 
    floors= FloorSerializer(read_only=True, many=True) 
    areas = AreaSerializer(read_only=True, many=True) 
    class Meta: 
     model = Building 
     fields = '__all__' 
     read_only_fields = ('id',) 

class CompanySerializer(serializers.ModelSerializer): 
    buildings= BuildingSerializer(read_only=True, many=True) 
    class Meta: 
     model = Company 
     fields = '__all__' 
     read_only_fields = ('id',) 

我怎樣才能解決這個問題?

P.S.我知道json有點多餘!

回答

0

99%的時間,當你沒有得到嵌套的數據是因爲你發送一個JSON負載與表單內容類型。

通過將Content-Type標頭設置爲application/json並在您的客戶端中明確表明您要發送JSON,並且應該解決內容問題。

+0

我已經指定了'應用/ json'格式在*的Content-Type *頭。 –

0

您指定的建築物作爲一個只讀字段:http://www.django-rest-framework.org/api-guide/serializers/#specifying-read-only-fields

嘗試在串行去除參數:

class BuildingSerializer(serializers.ModelSerializer): 
    floors= FloorSerializer(many=True) 
    aree = AreaSerializer(many=True) 
    class Meta: 
     model = Building 
     fields = '__all__' 
     read_only_fields = ('id',) 

class CompanySerializer(serializers.ModelSerializer): 
    buildings= BuildingSerializer(many=True) 
    class Meta: 
     model = Company 
     fields = '__all__' 
     read_only_fields = ('id',) 
+0

如果我刪除'read_only = True',它表示json無效(串行器方法__is_valid()__失敗)。 –

+0

哦,這是冗餘問題。你應該擺脫這一點。一般而言,您只能避免發佈嵌套超過2級的結構。 – fodma1

+0

@FedericoScardina你能使它工作嗎? – fodma1