2017-09-22 38 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

謝謝您的回答。經驗證的數據一次只能提供一個字典。 – Thameem

+0

其良好的答案,但驗證數據一次只給出一個字典。有沒有其他辦法可以做到這一點。我也嘗試了創建方法。但問題在於它只給出一個字典。 – Thameem