首页 > 解决方案 > Django中嵌套JSON的序列化

问题描述

class GrossenSerializer(serializers.Serializer):
    artikelNr1 = serializers.IntegerField()
    artikelNr2 = serializers.IntegerField()
    artikelGr = serializers.IntegerField()
    groessenText = serializers.CharField()
    sku = serializers.CharField()
    istZl = serializers.IntegerField()
    verkPeriode = serializers.IntegerField()

    def validate(self, attrs):
        return super(GrossenSerializer, self).validate(attrs)


class CategoriesRootsSerializer(serializers.Serializer):
    id = serializers.IntegerField()
    name = serializers.CharField()
    parentCategoryId = serializers.IntegerField()

    def validate(self, attrs):
        return super(CategoriesRootsSerializer, self).validate(attrs)

class CategoriesSerializer(serializers.Serializer):
    id=serializers.IntegerField()
    name=serializers.CharField(max_length=50)
    parentCategoryId=serializers.IntegerField()
    categoryRoots = serializers.ListField(child=CategoriesRootsSerializer(many=True, read_only=True))

    def validate(self, attrs):
        return super(CategoriesSerializer, self).validate(attrs)


    sku=serializers.CharField(max_length=50, allow_blank=True)
    artikelNr1=serializers.IntegerField()
    artikelNr2=serializers.IntegerField()
    StatusCode=serializers.IntegerField(required=False)
    statusText=serializers.CharField(max_length=50, allow_blank=True)
    SaisonRetourenCode=serializers.IntegerField(required=False)
    saisonRetourenText=serializers.CharField(max_length=50, allow_blank=True)
    saisonCode=serializers.IntegerField()
    saisonText=serializers.CharField(max_length=50, allow_blank=True)
    geschlechtCode=serializers.IntegerField()
    geschlechtText=serializers.CharField(max_length=50, allow_blank=True)
    RayonCode=serializers.IntegerField(required=False)
    rayonText=serializers.CharField(max_length=50)
    warenArtCode=serializers.IntegerField()
    warenArtText=serializers.CharField(max_length=50)
    wuCode=serializers.IntegerField()
    wuText=serializers.CharField(max_length=50)
    waCode=serializers.IntegerField()
    warenGruppe=serializers.CharField(max_length=50, allow_blank=True)
    alterCode=serializers.IntegerField()
    farbe=serializers.CharField(max_length=50)
    material=serializers.CharField(max_length=50)
    bezeichnung=serializers.CharField(max_length=50)
    pictureName=serializers.CharField(max_length=50)
    picturePathLocal=serializers.CharField(max_length=50)
    kollektion=serializers.CharField(max_length=50, allow_blank=True)
    comCode=serializers.CharField(max_length=50)
    lieferant=serializers.CharField(max_length=50)
    eKchf=serializers.FloatField()
    eti=serializers.FloatField()
    vp=serializers.FloatField()
    groessenCode=serializers.IntegerField()
    groessen=GrossenSerializer(many=True,  read_only=True)

    zlQty=serializers.IntegerField()
    productId=serializers.IntegerField()
    published=serializers.BooleanField()
    categories=CategoriesSerializer(many=True, read_only=True)
    productName=serializers.CharField(max_length=50)
    shortDescription=serializers.CharField(max_length=150)
    fullDescription=serializers.CharField()
    flag=serializers.CharField(allow_blank=True)
    def validate(self, attrs):
        return super(RecommendationJsonSerializer, self).validate(attrs)

在一个视图中,我通过这样的 Get 方法调用它

    if request.method == 'GET':
        for json in jsonList:
            data = json
            data['author'] = request.user.pk
            serializer = RecommendationJsonSerializer(data=data)
            data = {}
            print(serializer.is_valid())
            if serializer.is_valid():
                print(serializer.error_messages)
                return Response(data=data)

我收到这个错误

{'required': 'This field is required.', 'null': 'This field may not be null.', 'invalid': 'Invalid data. Expected a dictionary, but got {datatype}.'}

我正在尝试序列化的输入 JSON

  {'artikelNr1': 133198, 'artikelNr2': 0, 'sku': '133198.00', 'statusCode': 4, 'statusText': 'Manuell Bewirtschaftung', 'saisonRetourenCode': 0, 'saisonRetourenText': 'unbestimmt', 'saisonCode': 0, 'saisonText': 'SAISON', 'geschlechtCode': 1, 'geschlechtText': 'UNISEX', 'rayonCode': 0, 'rayonText': '<RAYON>', 'warenArtCode': 6600, 'warenArtText': 'ACCESSOIRES/DIV.', 'wuCode': 66, 'wuText': 'ACCESSOIRES/DIV.', 'waCode': 6, 'warenGruppe': 'DESSOUS', 'alterCode': 20164, 'farbe': 'BLACK', 'material': 'PLASTIC', 'bezeichnung': "'METRO BOUTIQUE GIFTCARD' CHF20", 'pictureName': 'art_133198_00.jpg', 'picturePathLocal': 'p:\\', 'kollektion': '', 'comCode': 'METRO BOUTIQUE GESCHENKKARTE CHF 20', 'lieferant': '...', 'eKchf': 0, 'eti': 20, 'vp': 20, 'groessenCode': 0, 'groessen': [{'artikelNr1': 133198, 'artikelNr2': 0, 'artikelGr': 1, 'groessenText': 'os', 'sku': '133198.00.01', 'istZl': 463, 'verkPeriode': -268}], 'zlQty': 463, 'productId': 82482, 'published': True, 'categories': [{'categoryRoots': [{'id': 1, 'name': 'Damen', 'parentCategoryId': 0}, {'id': 188, 'name': 'Geschenkkarten', 'parentCategoryId': 1}], 'id': 188, 'name': 'Geschenkkarten', 'parentCategoryId': 1}, {'categoryRoots': [{'id': 2, 'name': 'Herren', 'parentCategoryId': 0}, {'id': 186, 'name': 'Geschenkkarten', 'parentCategoryId': 2}], 'id': 186, 'name': 'Geschenkkarten', 'parentCategoryId': 2}, {'categoryRoots': [{'id': 3, 'name': 'Mädchen', 'parentCategoryId': 0}, {'id': 183, 'name': 'Geschenkkarten', 'parentCategoryId': 3}], 'id': 183, 'name': 'Geschenkkarten', 'parentCategoryId': 3}, {'categoryRoots': [{'id': 4, 'name': 'Jungen', 'parentCategoryId': 0}, {'id': 180, 'name': 'Geschenkkarten', 'parentCategoryId': 4}], 'id': 180, 'name': 'Geschenkkarten', 'parentCategoryId': 4}, {'categoryRoots': [{'id': 1, 'name': 'Damen', 'parentCategoryId': 0}, {'id': 376, 'name': 'Bekleidung', 'parentCategoryId': 1}, {'id': 21, 'name': 'Fanshop', 'parentCategoryId': 376}], 'id': 21, 'name': 'Fanshop', 'parentCategoryId': 376}, {'categoryRoots': [{'id': 2, 'name': 'Herren', 'parentCategoryId': 0}, {'id': 411, 'name': 'Bekleidung', 'parentCategoryId': 2}, {'id': 32, 'name': 'Fanshop', 'parentCategoryId': 411}], 'id': 32, 'name': 'Fanshop', 'parentCategoryId': 411}], 'productName': 'Giftcard', 'shortDescription': 'Giftcard - Schwarz + Gelb', 'fullDescription': "<p>Metro Geschenkkarte - die perfekte Geschenkidee für alle Gelegenheiten<br />Dient als komfortables Zahlungsmittel in sämtlichen Metro Boutique Filialen und in unserem Online-Shop<br />Die Geschenkkarte kann in jeder Filiale aufgeladen werden<br /><span style='color:red'><span style='color:red'>Nicht retournierbar!</span></span></p>", 'flag': '', 'author': 1}
    

这是我试图提供给这个序列化程序的输入 JSON 是否有人知道我做错了什么......

标签: django-rest-framework

解决方案


推荐阅读