1

J'ai le problème suivant. Je dois créer un objet complexe en utilisant les données POSTed dans json. Dans le fichier models.py, j'ai l'objet principal appelé « Société »:Django - Comment désérialiser json dans un objet imbriqué

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

    def __str__(self): 
     return self.name 

Ensuite, je dois « Bâtiment »:

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) 

Et ainsi de suite avec quelques autres classes (ie « étage » , "Zone", "Chambre").

JSON que je reçois de la requête POST est:

{ 
    "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" 
} 

Lorsque je tente de créer un objet « Société » du JSON que je reçois, il ne crée que ce qui suit:

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

et pas la structure complète.

Mes serializers sont les suivantes:

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',) 

Comment puis-je résoudre ce problème?

P.S. Je sais que le json est un peu redondant!

Répondre

0

99% des fois où vous n'obtenez pas les données imbriquées, c'est parce que vous envoyez une charge JSON avec un type de contenu de formulaire. Dites explicitement à votre client que vous envoyez JSON en définissant l'en-tête Content-Type sur application/json et que le problème de contenu devrait être résolu.

+0

je l'ai déjà spécifié le format 'application/json' dans le * Content-Type * entête. –

0

Vous spécifiez les bâtiments comme un champ de lecture seule: http://www.django-rest-framework.org/api-guide/serializers/#specifying-read-only-fields

Essayez de supprimer ce paramètre dans le sérialiseur:

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

Si je supprime 'read_only = True' il est dit que le json n'est pas valide (la méthode sérialiseur __is_valid() __ échoue). –

+0

Oh, c'est le problème de la redondance. Vous devriez vous en débarrasser. En général, vous évitez seulement d'afficher des structures imbriquées à plus de 2 niveaux. – fodma1

+0

@FedericoScardina pourriez-vous le faire fonctionner? – fodma1