Djangoroidの奮闘記

python,django,angularJS1~三十路過ぎたプログラマーの奮闘記

Django REST Frameworkに再挑戦 その9 Serializer Method Field

概要

Django REST Frameworkに再挑戦 その9 Serializer Method Field

参考サイト

www.django-rest-framework.org

www.codingforentrepreneurs.com

Serializer Method Field

Serializer fields - Django REST framework

method_name - The name of the method on the serializer to be called. If not included this defaults to get_<field_name>.
# get_フィールド名の関数を定義すると、その関数で定義した通りに表示されるということだと思う。
# 例だとuser の firstnameを取り出して表示するときとかに使うことが多いみたい。あとは商品テーブルだと価格とかかな。
  • serializers.pyにコードを追記する。これはuserの箇所にusernameを表示させるコード。
from rest_framework.serializers import (
        HyperlinkedIdentityField,
        ModelSerializer,
        SerializerMethodField,
        )
...
class PostListSerializer(ModelSerializer):
    url = post_detail_url
    user = SerializerMethodField()
    class Meta:
        model = Post
        fields = [
            'url',
            'user',
            'title',
            'content',
            'publish',
        ]

    def get_user(self, obj):
        return str(obj.user.username)
  • さらにimageのurlなども表示できる。
class PostDetailSerializer(ModelSerializer):
    url = post_detail_url
    user = SerializerMethodField()
    image = SerializerMethodField()
    class Meta:
        model = Post
        fields = [
            'url',
            'user',
            'id',
            'title',
            'slug',
            'content',
            'publish',
            'image',
        ]

    def get_user(self, obj):
        return str(obj.user.username)

    def get_image(self, obj):
        try:
            image = obj.image.url
        except:
            image = None
        return image
  • さらに元々のclassのインスタンス(ここでは、Post classのインスタンス)のメソッドも呼び出してセットできる。ここでは、get_markdownメソッドを呼び出してその返り値をセットしてみる。
class PostDetailSerializer(ModelSerializer):
    url = post_detail_url
    user = SerializerMethodField()
    image = SerializerMethodField()
    markdown = SerializerMethodField()
    class Meta:
        model = Post
        fields = [
            'url',
            'user',
            'id',
            'title',
            'slug',
            'content',
            'markdown',
            'publish',
            'image',
        ]

    def get_markdown(self, obj):
        return obj.get_markdown()

    def get_user(self, obj):
        return str(obj.user.username)

    def get_image(self, obj):
        try:
            image = obj.image.url
        except:
            image = None
        return image
  • これも便利やな〜〜!!すげぇ!