2017-09-22 8 views
0

models.py 처음직렬 검증 방법

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

] 

위 고객 json 목록에는 이메일과 전화가 같은 두 개의 개체가 있습니다. 하지만 처음 만들 경우 전자 메일과 전화 (유효성 검사 방법이 작동하지 않음)의 유효성을 검사하지 않습니다. 하지만 일단 만들어지면 두 번째로 동일한 목록으로 고객을 만들려고 할 때 유효성 검사 방법이 예상대로 작동합니다. 문제를 추적 할 수 없습니다.

답변

0

당신은 시도 할 수 있습니다 : 당신의 대답에 대한

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

감사합니다. 유효성이 검사 된 데이터는 한 번에 하나의 dict을 제공합니다. – Thameem

+0

좋은 답변이지만 검증 된 데이터는 한 번에 하나의 사전 만 제공합니다. 그것을 할 수있는 다른 방법이 있습니까? 나는 방법을 창조해서 그것을 또한 시도했다. 하지만 문제는 한 번에 하나의 dict을주는 시점입니다. – Thameem