ドキュメントから:
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メソッドが実行されていないことを確認しました実行された、何かアイデア?
ええ、私はある時点でこの問題に出くわしました。検証の除外も更新する必要があります。
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']
誰かが同様の問題でここに着地した場合、required
とともに以下の属性に注意してください。
True
に設定した場合、空の文字列は有効な値と見なされます。
通常、
None
がシリアライザーフィールドに渡されると、エラーが発生します。
必須 :
通常、逆シリアル化中にフィールドが提供されない場合、エラーが発生します。
required=False
属性で見逃していたallow_null
で検証エラーが発生した理由を理解するのに苦労していました。
このスレッドへの遅延エントリ。この問題は Django-rest-framework 2.3.1 で修正されました。 [〜#〜] pr [〜#〜] のリンクです。
メソッド.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
は、オブジェクトの事前保存()で呼び出されます(おそらく)シリアライザーの検証後を意味します。