Django REST Frameworkの中身を少し調べた。(serializers.CharField)
serializerでデータを更新できない!!
serializerを使ってデータを操作しようとしたところエラーになってしまい挙動がわからないことがあったので内部のコード眺めてみました。
サンプルのシリアライザ定義
以下、例です(変数名とか雰囲気で読んでください)
class CatSerializer(serializers.ModelSerializer):
name = serializers.CharField()
birthday = serializers.DateField(
format="%Y-%m-%d",
required=False,
input_formats=["%Y-%m-%d"])
gendar_code = serializers.IntegerField(required=False)
class Meta:
model = Cats
fields = (
'name',
'birthday',
'gendar_code'
)
実行コード
以下、事象発生させるコード。
>>> serializer = CatSerializer(instance, data=params, partial=True)
>>> serializer.is_valid(raise_exception=True) # ここでエラー
>>> serializer.save()
詳しいエラー文言忘れてしまいましたが、Invalid data. String not valid.
みたいなこと言われました。
Django REST Frameworkの中を見てみる
「あー…はいはい」と適当に見当つけながらいくつか思いつく方法をためしたのですがだめでした。
このままでは嵌りそうだったのでエラーになった項目のフィールドの処理を見ることにしました。
GitHubでSerializerのFieldタイプごとの処理を確認。
CharFieldの項目でエラーになっていたので確認。
753行目移行がCharFieldの処理。その中に以下のような場所が
def to_internal_value(self, data):
# We're lenient with allowing basic numerics to be coerced into strings,
# but other types should fail. Eg. unclear if booleans should represent as `true` or `True`,
# and composites such as lists are likely user error.
if isinstance(data, bool) or not isinstance(data, six.string_types + six.integer_types + (float,)):
self.fail('invalid')
value = six.text_type(data)
return value.strip() if self.trim_whitespace else value
isinstance
でdataのデータ型見てたみたいですね。
sixってなんだ?とも思った場合はこちら。DjangoのUtilityモジュールでした。
内部処理わかったところで原因を見つける
その上で改めて実行していたコードのdata(上記sampleでいうところのprams)を見てみました。
そうすると以下のような感じに。
>>> print(dir(params))
{name: b'適当な文字列', birthday: '2019-03-06', gendar_code: 1}
「name(実際は違う変数だけど)がバイト列じゃん!こいつか!!」
ということで、このデータに対応するように修正したら動作しました。
Author And Source
この問題について(Django REST Frameworkの中身を少し調べた。(serializers.CharField)), 我々は、より多くの情報をここで見つけました https://qiita.com/nekonekonetwork/items/a6984d9eed94a60b9578著者帰属:元の著者の情報は、元のURLに含まれています。著作権は原作者に属する。
Content is automatically searched and collected through network algorithms . If there is a violation . Please contact us . We will adjust (correct author information ,or delete content ) as soon as possible .