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リストには、同じメールと電話の2つのオブジェクトがあります。しかし、私が最初に作成した場合、電子メールと電話機の検証は行われません(検証方法は機能しません)。しかし、いったんそれが作成されると、同じリストで顧客を作成しようとする2回目に、検証方法が期待通りに機能しています。 問題をトレースできませんでした。

答えて

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

感謝。検証されたデータは、一度に1つの辞書だけを与えます。 – Thameem

+0

妥当な答えですが、検証されたデータは一度に1つのdictしか与えません。それを行うための他の方法はありますか?私も同様にメソッドを作成してみました。問題は一度に1つしか与えられないときです。 – Thameem