web-dev-qa-db-ja.com

Django REST Framework serializerフィールドrequired = false

ドキュメントから:

read_onlyこれをTrueに設定すると、表現のシリアル化時にフィールドが使用されますが、逆シリアル化中にインスタンスを更新するときには使用されません。

デフォルトはFalse

必須通常、逆シリアル化中にフィールドが提供されない場合、エラーが発生します。逆シリアル化中にこのフィールドを表示する必要がない場合は、falseに設定します。

デフォルトはTrueです。

だから私はnullを許可しないフィールドを持つモデルを持っていますが、pre_saveメソッドに入力したいので、シリアライザでフィールドをrequired=Falseに設定しましたが、動作していないようですレコードを保存するときにエラーが発生します。

class FavoriteListSerializer(serializers.ModelSerializer):
    owner = serializers.IntegerField(required=False)
    class Meta:
        model = models.FavoriteList

更新:serializer_class = serializers.FavoriteListSerializerを取得する代わりにThis field is requiredをViewSetに追加しました。これは検証を通過したと思われますが、This field cannot be null.を取得していますpre_saveメソッドが実行されていないことを確認しました実行された、何かアイデア?

27
James Lin

ええ、私はある時点でこの問題に出くわしました。検証の除外も更新する必要があります。

class FavoriteListSerializer(serializers.ModelSerializer):
    owner = serializers.IntegerField(required=False)
    class Meta:
        model = models.FavoriteList

    def get_validation_exclusions(self):
        exclusions = super(FavoriteListSerializer, self).get_validation_exclusions()
        return exclusions + ['owner']
37
Kevin Stone

誰かが同様の問題でここに着地した場合、requiredとともに以下の属性に注意してください。

allow_blank

Trueに設定した場合、空の文字列は有効な値と見なされます。

allow_null

通常、Noneがシリアライザーフィールドに渡されると、エラーが発生します。

必須

通常、逆シリアル化中にフィールドが提供されない場合、エラーが発生します。

required=False属性で見逃していたallow_nullで検証エラーが発生した理由を理解するのに苦労していました。

13
Wtower

このスレッドへの遅延エントリ。この問題は Django-rest-framework 2.3.1 で修正されました。 [〜#〜] pr [〜#〜] のリンクです。

3
Pankaj Singhal

メソッド.get_validation_exclusions()が削除されたと思います。 ModelSerializer doc で見つけられず、オーバーライド後に実行されませんでした(djangorestframework == 3.8.2)。 この問題に直面しているのは私だけではありません

私の解決策は、必要ではないフィールドにデフォルト値を追加することです。 pre_saveを使用した場合に特に適しているはずです。

class FavoriteListSerializer(serializers.ModelSerializer):
    owner = serializers.IntegerField(default='')
    class Meta:
        model = models.FavoriteList

また、pre_save信号でdrfシリアライザを使用すると、暗黙的な動作が発生する可能性があります(私はチェックしませんでしたが、論理的なようです):

pre_saveは、オブジェクトの事前保存()で呼び出されます(おそらく)シリアライザーの検証後を意味します。

0
validname