Djangoroidの奮闘記

python,django,angularJS1~三十路過ぎたプログラマーの奮闘記

Django REST Frameworkに再挑戦 その19 Serializer Validation

概要

Django REST Frameworkに再挑戦 その19 Serializer Validation

参考サイト

www.django-rest-framework.org

www.codingforentrepreneurs.com

Serializer Validation

  • serializers.pyにコードを追記する。
...
class UserCreateSerializer(ModelSerializer):
    email = serializers.EmailField(label='Email Address') #emailフィールドのserializerによる上書き
    email2 = serializers.EmailField(label='Confirm Email') #confirm用のフィールド。
    class Meta:
        model = User
        fields = [
            'username',
            'email',
            'email2',
            'password',
        ]
        extra_kwargs = {"password":
                            {"write_only": True}
                            }

    def validate_email2(self, value):#validate_フィールド名で、validationをセットできるぽい。
        data = self.get_initial() 
        email1 = data.get("email")
        email2 = value
        if email1 != email2:
            raise ValidationError("Emailが一致していません。")
        return value
....
  • 次は、重複したemailの登録がないかをvalidateする。
    def validate(self, data):
        email = data['email']
        user_qs = User.objects.filter(email=email)
        if user_qs.exists():
            raise ValidationError("すでにこちらのアドレスは登録されています。")
        return data
  • これをvalidate_emailに含める。
    def validate_email(self, value):#validate_フィールド名で、validationをセットできるぽい。
        data = self.get_initial()
        email1 = data.get("email2")
        email2 = value
        if email1 != email2:
            raise ValidationError("Emailが一致していません。")

        user_qs = User.objects.filter(email=email2)
        if user_qs.exists():
            raise ValidationError("すでにこちらのアドレスは登録されています。")

        return value