記事投稿リハビリ用の雑知見置き場

記事投稿力が落ちているので、
リハビリ的に雑に知見をまとめていく

DRFのエラーメッセージ変更
1年近く仕事でDRFを触っていたにも関わらず、最近になってデフォルトで出力されるエラーメッセージの微妙さに気がついた(普段はフロントや個別のバリデーションでメッセージを出してた)
例えば
class UserSerializer(serializers.ModelSerializer):
name = serializers.CharField(max_length=30) # 30字を超えるとエラー
class Meta:
model = User
みたいなシリアライザがあったとしたら、
name
に31字以上の文字列が入ったときにはエラーが出力される
その時のエラーメッセージが
この項目が30文字より長くならないようにしてください。
なのだ
なんだ「この項目」って
そんなエラーメッセージをフロントで出されても...という感じだ
labelをつけてやればもしかして「この項目」が置き換わったりしないかな?
name = serializers.CharField(label="氏名", max_length=30)
と思ったけどだめだった
調べてみた感じ、Fieldクラスのerror_messages
にエラーメッセージを設定してあげれば良いみたい
name = serializers.CharField(max_length=30, error_messages={"max_length": "氏名は30文字以内で入力してください。"})
これでエラーメッセージが設定できた
「30字」を動的にしたいなと思ったらできるみたい(流石にできなかったら困る)
name = serializers.CharField(max_length=30, error_messages={"max_length": "氏名は{max_length}文字以内で入力してください。"})
残念ながら、error_messages
に設定する値のkeyが公式ドキュメントを漁っても見つけられなかった(ありましたら教えていただけると助かります)
コードをたどってみると、CharFieldの場合は
required
null
invalid
blank
max_length
min_length
をkeyにすれば良いということはわかった
エラーメッセージ内で置き換わる対象の文字列は正直良くわからない...
({max_length}
{min_length}
)くらいしかわかんね)

DjangoのQuerySetでJSONFieldをfilterする
JSONFieldで定義された項目を用いてfilterしたい時がある
こんな感じのモデルがあるとする
class Hoge(PostgresModel):
fuga = models.JSONField()
fugaには以下のようなデータが保存されているとする
{
"xxx": 0 or 1,
}
xxxの値でfilterしたいときは以下のように記述する
Hoge.objects.filter(fuga__xxx=0)
割と単純な書き方ができるんだなぁと感心した