DjangoBrothers BLOG ✍️

2022/11/10

このエントリーをはてなブックマークに追加
DjangoRESTFramework

DRFでモデルのpropertyメソッドをシリアライズする

Django REST Framework でモデルのpropertyメソッドをシリアライズする方法についてです。

こんなpropertyメソッドを持つモデルがあったとします。

models.py

class Hoge(models.Model):

    @property
    def get_absolute_url(self):
        return reverse("detail", kwargs={"pk": self.pk})

この時、get_absolute_urlの値は以下のようにReadOnlyFieldとsource パラメーターを使ってシリアライズできます。(メソッド名とシリアライザのフィールド名が同じ場合はsourceは不要です。)

serializers.py

url = serializers.ReadOnlyField(source="get_absolute_url")

SerializerMethodField を使うこともできますが、プロパティメソッドの値をそのまま使うだけならsourceを使ったほうが簡潔に書けます。

serializers.py

url = serializers.SerializerMethodField()

def get_url(self, obj):
    return obj.get_absolute_url

https://www.django-rest-framework.org/api-guide/fields/#source