Open2
Django Serializer の 触ってみる
DRF(Django REST Framework)のSerializerの公式ドキュメント
ListSerializerについて
Serializers - Django REST framework
You won't typically need to use ListSerializer directly, but should instead simply pass many=True when instantiating a serializer.
普通はListSerializerを使わずこう書けばよい
class ParentResourceSerializer(....)
child_resources = ChildResourceSerializer(many=True)
class ChildResourceSerializer(....)
id = ...
name = ...
Django Rest Framework ListSerializerの書き方 #Python - Qiita
特定のfieldに対するvalidation error messageを格納したい場合
add_error(fieldname, ...) in Django Rest Framework (DRF) - Stack Overflow
ネストした子SerializerのIDがvalidate後になくなる件
.instance, .data, .context
初見ではそれぞれどういうものかわからない。いきなりこの3つを把握するというよりはシチュエーションごとにわけて捉えるとよい
1. GET系API のSerializer
例
class OrganizationResponseSerializer(serializers.Serializer)
id = ...
name = ...
- View側から Serializerの.data には直接なにかを渡さない
- .data はSerializer が作るもの
- View側からは Serializerのコンストラクタで instance にDBデータなどをいれておくと、Serializerがinstanceを使ってclass property などで定義したfield構造に従って、.dataを作ってくれる
from myapp.models impoort Organization
class OrganizationView(....)
def get(....):
org = Organiation.object.get(pk=...)
serializer = OrganizationResponseSerializer(instance=org)
return Response(serializer.data, status=200)
※ そもそも理想的なDRFのViewのmethodの中で特定のserializerクラスのインスタンス化をするのではなく Viewクラスの class property serializer = ... にSerializerクラスをわたしてquerysetでどうのこうの、というようにするのがよりよい。
2. Create/Update/Delete 系APIのSerializer
- dataには検証対象の入力データを渡す
- responseとして返すものがないMutation系Serializer(validationが主たる目的)の場合instanceは不要だったりする
- 検証対象データではなく、検証に使うなんらかの他のデータは.contextにいれておくとよい