0

これは私の UserExtendedSerializer です:

class UserExtendedSerializer(serializers.ModelSerializer):

    def __init__(self, *args, **kwargs):
            super(UserExtendedSerializer, self).__init__(*args, **kwargs) # call the super() 
            for field in self.fields: # iterate over the serializer fields
                self.fields[field].error_messages['required'] = 'Enter a valid %s.'%field # set the custom error message
                self.fields[field].error_messages['invalid'] = 'Select a valid %s.'%field # set the custom error message
    class Meta:
        model = UserExtended
        fields = ('country',)

これは私のmodels.pyです:

class Country(models.Model):
    countryName = models.CharField(max_length=50, unique=True)
    countryCode = models.CharField(max_length=10, unique=True)

class UserExtended(models.Model):
    user = models.OneToOneField(User)
    country = models.ForeignKey(Country)

私の問題は、ユーザーが無効な型を送信すると (Django は整数/pk 値を期待しますが、ユーザーが文字列「a」を送信すると仮定します)、Django はフロントエンドに「不正な型です。期待される pk 値を受け取りました」というエラーを送信します。リスト。" シリアライザーの「無効な」エラーメッセージを無効にしましたが。フロント エンドに送信されるエラー メッセージが「有効な国を選択してください」ではなく、「タイプが正しくありません。期待される pk 値、受信したリスト」であるのはなぜですか。代わりは?

4

1 に答える 1

1

Django の検証が最初に実行されるためcountry field、読み取り専用として設定して Django モデルの検証を防止してから、update/createメソッドで国を検証し、必要に応じてエラーを発生させます。また、 CountrySerializer を作成する必要があります

class CountrySerializer(serializers.ModelSerializer):
    #country serializer fields goes here

class UserExtendedSerializer(serializers.ModelSerializer):
        country = CountrySerializer(read_only=True)
        class Meta:
            model = UserExtended
            fields = ('country',)

        def check_country(self):
            request = self.context['request']
            data = request.data
            country_data = data.get('country'):
            #Validated your country data
            #valid_country = .....
            if not valid_country:
                 raise serializers.ValidationError("Select a valid country")


        def create(self,validated_data):

            self.check_country()
            super(UserExtended,self).create(self,validated_data)

        def update(self,instance,validated_data):

            self.check_country()
            super(UserExtended,self).update(self,instance,validated_data)
于 2015-10-02T16:06:10.230 に答える