Djangoroidの奮闘記

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

Django REST Frameworkに再挑戦 その8 Hyperlinked Identity Field for URL

概要

Django REST Frameworkに再挑戦 その8 Hyperlinked Identity Field for URL

参考サイト

www.django-rest-framework.org

www.codingforentrepreneurs.com

Hyperlinked Identity Field for URL

Serializer relations - Django REST framework

  • まず、serializer.pyの、PostListSerializer classのコードを修正する。
from rest_framework.serializers import ModelSerializer, HyperlinkedIdentityField
...
class PostListSerializer(ModelSerializer):
    url = HyperlinkedIdentityField(
        view_name='posts-api:detail',#urlのnameを入れる。nameがincludeの場合は、name:name というように、:でつなぐ。
        lookup_field='slug',#これは、detailのページのurlに合わせる必要あり??
    )
    class Meta:
        model = Post
        fields = [
            'url',#ここは、上記で定義したHyperlinkedIdentityFieldにしたがって表示される。
            'user',
            'title',
            'slug',
            'content',
            'publish',
        ]
...
  • http://127.0.0.1:8000/api/posts/にアクセスすると、urlの箇所にそれぞれのdetailページのurlが表示されたリストが出てくるはず!

  • 同様にdeleteURLも設定できる。

class PostListSerializer(ModelSerializer):
    url = HyperlinkedIdentityField(
        view_name='posts-api:detail',#urlのnameを入れる。nameがincludeの場合は、name:name というように、:でつなぐ。
        lookup_field='slug',#これは、detailのページのurlに合わせる必要あり??
        )
    delete_url = HyperlinkedIdentityField(
        view_name='posts-api:delete',
        lookup_field='slug',
        )
    class Meta:
        model = Post
        fields = [
            'url',#ここは、上記で定義したHyperlinkedIdentityFieldにしたがって表示される。
            'user',
            'title',
            'content',
            'publish',
            'delete_url',
        ]
  • さらに、url をclassとは別に定義しておいてそれを使い回すこともできる。以下のような形で先にurlを定義しておくとスッキリかけるかも。
post_detail_url = HyperlinkedIdentityField(
    view_name='posts-api:detail',
    lookup_field='slug',
    )


class PostDetailSerializer(ModelSerializer):
    url = post_detail_url
    class Meta:
        model = Post
        fields = [
            'url',
            'id',
            'title',
            'slug',
            'content',
            'publish',
        ]


class PostListSerializer(ModelSerializer):
    url = post_detail_url
    delete_url = HyperlinkedIdentityField(
        view_name='posts-api:delete',
        lookup_field='slug',
        )
    class Meta:
        model = Post
        fields = [
            'url',#ここは、上記で定義したHyperlinkedIdentityFieldにしたがって表示される。
            'user',
            'title',
            'content',
            'publish',
            'delete_url',
        ]

これも便利やなぁ〜!