2017-09-22 9 views
0

models.pysérialiseurs méthode de validation ne sont pas valider liste d'objets pour la première fois

class Customer(models.Model): 

    name = models.CharField(max_length=128) 
    email = models.EmailField(null=True, blank=True) 
    phone = models.CharField(max_length=128) 

serializers.py

class CustomerSerializer(serializers.ModelSerializer): 

    class Meta: 
     model = Customer 
     fields = ("name", "email", "phone") 
     extra_kwargs = { 
      "email":{"required":True}, 
     } 


    def validate_email(self, email): 
     qs = Customer.objects.filter(email__iexact=email) 
     if qs.exists(): 
      raise serializers.ValidationError("This email is already existed") 
     return email 

    def validate_phone(self, phone): 
     qs = Customer.objects.filter(phone__iexact=phone) 
     if qs.exists(): 
      raise serializers.ValidationError("This Phone is already existed") 
     return phone 

views.py

class CustomerApi(SerializerMixin, APIView): 

    ...... 
    ......... 

    def post(self, request): 

     serializer = CustomerSerializer(data=request.data, many=True) 
     if serializer.is_valid(): 
      serializer.save() 
      return Response(serializer.data) 
     return Response(
         serializer.errors, 
         status = status.HTTP_400_BAD_REQUEST 
        ) 

json

[ 
{ 
    "phone": "123", 
    "name": "name1", 
    "email": "[email protected]" 
}, 
{ 
    "phone": "123", 
    "name": "nam32", 
    "email": "[email protected]" 
} 

] 

la liste ci-dessus json client ont deux objets avec même email et téléphone. Mais il ne valide pas l'email et le téléphone (les méthodes de validation ne fonctionnent pas) quand je crée si pour la première fois. Mais une fois qu'il est créé, la deuxième fois que j'essaie de créer le client avec la même liste, la méthode de validation fonctionne comme prévu. Je n'ai pas pu identifier le problème.

Répondre

0

vous pouvez essayer:

class CustomerSerializer(serializers.ModelSerializer): 
    # Your code here 

    def validate(self, validated_data): 
     emails = [x['email'] for x in validated_data] 
     if len(emails) > len(set(emails): 
      raise serializers.ValidationError("Duplication email in data") 
     phones = [x['phone'] for x in validated_data] 
     if len(phones) > len(set(phones): 
      raise serializers.ValidationError("Duplication phone in data") 
     return validated_data 
+0

Merci pour votre réponse. Les données validées ne donnent qu'une seule dictée à la fois. – Thameem

+0

sa bonne réponse, mais les données validées ne donne qu'une dict à la fois. Y a-t-il un autre moyen de le faire? Je l'ai essayé avec la méthode de création aussi bien. mais le problème est à la fois il donne seulement un dict. – Thameem