Несоответствие типов в сериализаторе django для разбора запроса - PullRequest
0 голосов
/ 25 марта 2020

Я создал следующие сериализаторы для анализа запроса JSON данных. Однако при выполнении операции я получаю неожиданную ошибку.

class A(serializers.ModelSerializer):            
    class Meta:                                                
        model = CName                                  
        fields = ('id','contact','email')                      
        read_only_fields=('contact',)                            

class B(serializers.ModelSerializer):      
    class Meta:                                                
        model = PName                                    
        fields = ('id','contact','number')                    
        read_only_fields=('contact',)              

class C(serializers.ModelSerializer):          
    contact_number = A(many=True)          
    contact_email = B(many=True)                

    class Meta:                                                  
        model = Contact                                          
        fields = ('id','name','contact_number','contact_email')  

    def create(self,validated_data):         
        contact_number=validated_data.pop('contact_number')      
        contact_email =validated_data.pop('contact_email')      
        instance = Contact.objects.create(**validated_data)            
        for number in contact_number:                                                           
            PName.objects.create(contact=instance,**number)      
        for email in contact_email:                                    
            CName.objects.create(contact=instance,**email)      
        return instance

    def update(self, instance, validated_data):                  
        contact_number=validated_data.pop('contact_number')      
        contact_email =validated_data.pop('contact_name')            
        Contact.objects.filter(id=instance.id).update(**validated_data)
        number_to_keep=[]                                              
        email_to_keep=[]                                              
        for number in contact_number:                                  
            if number.get('id'):                                      
                ph_id = number.pop('id')                              
                PName.objects.filter(id=ph_id).update(**number)  
                number_to_keep.append(ph_id)                          
            else:                                                      
                ph=PName.objects.create(contact=instance,**number)
                number_to_keep.append(ph.id)                            
        for email in contact_email:                                    
            if email.get('id'):                                        
                em_id = email.pop('id')                                
                CName.objects.filter(id=em_id).update(**email)  
                email_to_keep.append(em_id)                            
            else:                                                        
                em = CName.objects.create(contact=instance,**email)
                email_to_keep.append(em.id)                              
        instance.contact_number.exclude(id__in=number_to_keep).delete()  
        instance.contact_email.exclude(id__in=email_to_keep).delete()     
        return instance

У меня есть json -формат, где я передаю данные запроса в формате (у меня будут только строки) :

{
"contact_number": "9999999999",
"contact_email":"timsh@hotmail.com"
}

При вызове сериализатора с использованием следующего кода:

contact_details = Contact.objects.get(rest = rest)
contact_serializer = ContactSerializer(contact_details,data=request.data)

Я получил ответ, как показано ниже:

{
    "contact_number": {
        "non_field_errors": [
            "Expected a list of items but got type \"unicode\"."
        ]
    },
    "contact_email": {
        "non_field_errors": [
            "Expected a list of items but got type \"unicode\"."
        ]
    }
}

Примечание: у меня не может быть формата данных JSON в следующем формате:

{
"contact_number" : [
                    { "number" : "9999999999"
                     }
],
"contact_email" : [
                    { "email" : "tim@hotmail.com"
                     }
]
}

Может кто-нибудь предложить, какие изменения могут быть внесены в сериализатор, чтобы я мог преодолеть эту проблему здесь ,

1 Ответ

0 голосов
/ 25 марта 2020
class A(serializers.ModelSerializer):            
    class Meta:                                                
        model = CName                                  
        fields = ('id','contact','email')                      
        read_only_fields=('contact',)  

    def save(self, **kwargs):
        [obj.save(**kwargs) for obj in self]

Использовать пользовательский метод сохранения при сохранении.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...