6

これは私の serializers.py です (組み込みの User モデルのシリアライザーを作成したい):

from rest_framework import serializers

from django.contrib.auth.models import User

class UserSerializer(serializers.ModelSerializer):

    class Meta:
        model = User
        fields = ('username', 'password', 'email', )

    def validate_username(self, username):
        if not re.search(r'^\w+$', username): #checks if all the characters in username are in the regex. If they aren't, it returns None
            raise serializers.ValidationError('Username can only contain alphanumeric characters and the underscore.')
        try:
            User.objects.get(username=username)
        except ObjectDoesNotExist:
            return username
        raise serializers.ValidationError('Username is already taken.')

問題は、既に存在するユーザー名を使用してユーザーを作成しようとすると、次の辞書が返されることです。

{'username': [u'This field must be unique.']}

と言うより

{'username': [u'Username is already taken']}

これに validate_username 関数を再作成しました (テスト目的で):

    def validate_username(self, username):
        raise serializers.ValidationError('Testing to see if an error is raised.')

エラーは発生しません。DjangoRestFramework が validate_username 関数を無視している理由は何ですか?

編集: ModelSerializer を使用していることに注意してください (ここのチュートリアル: http://www.django-rest-framework.org/api-guide/serializers/#validationでは、シリアライザーのフィールドレベルの検証についてのみ説明しています。 ModelSerializer)。それが違いを生むかどうかを確認してください。

4

2 に答える 2

6

フィールド レベルの検証は、シリアライザー レベルの検証の前に呼び出されます。

そのため、ユーザー名が のモデルUserunique=Trueは、ユーザー名が既に存在するため、フィールド レベルの検証で例外が発生します。DRFUniqueValidatorは、フィールドが一意でない場合に例外を発生させるというこの作業を行います。

DRFソースコードによると、

class UniqueValidator:
    """
    Validator that corresponds to `unique=True` on a model field.

    Should be applied to an individual field on the serializer.
    """
    message = _('This field must be unique.')

これらのバリデーターはシリアライザーレベルの検証の前に実行されるため、 yourvalidate_usernameが呼び出されることはありません。

于 2015-06-04T09:34:28.873 に答える