Open2

Django Serializer の 触ってみる

tomllatomlla

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後になくなる件

tomllatomlla

.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にいれておくとよい