0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

Django REST frameworkのメモ

Last updated at Posted at 2023-11-19

背景

Chat GPT-3.5にDjango REST frameworkのAPIを作らせようとしたが、
少し勉強しないとChat GPTが作ったコードの評価できないため、
Django REST frameworkのチュートリアルなどを一通り読むことにした。

詳細な手順等は公式のチュートリアルを参照すればよいため、個人的に気になったことのみメモする。

学習内容

Djangoでプロジェクトやアプリを作成したら、
Django REST frameworkを使うには下記ファイルを編集or新規作成する。

  • アプリ名/models.py
    下記のように適当なモデルを追加する。

    models.py
    from django.db import models
    
    class ArticleTag(models.Model):
        """タグ一覧"""
        tag_name = models.CharField(max_length=50)
        created_date = models.DateTimeField(auto_now_add=True)
        updated_date = models.DateTimeField(auto_now=True)
        is_deleted = models.BooleanField(default=False)
    
        class Meta:
            """デフォルトのソート条件"""
            ordering = ['created_date']
    

     

  • アプリ名/serializers.py
    モデルとJSONの変換できるように下記を記載する(シリアル化)。
    本当はカラムごとに型を指定するコードの方がよさそうだが、
    こちらの方が簡単に記載できる。

    serializers.py
    from rest_framework import serializers
    from .models import ArticleTag
    
    class ArticleTagSerializer(serializers.ModelSerializer):
        class Meta:
            model = ArticleTag
            # これで全てのカラムを指定できる
            fields = '__all__'
    

     

  • アプリ名/views.py
    下記はのように書けば概ね問題なし。DELETEなどを追加したいなら別途DELETE関数を追加する。
    ListCreateAPIViewなどを使えばGET関数などを省略できるが、
    簡略化されすぎてよくわからないため今回は採用しない。

    views.py
    from rest_framework.views import APIView
    from rest_framework.response import Response
    from rest_framework import status
    from .models import ArticleTag
    from .serializers import ArticleTagSerializer
    
    class ArticleTagAPIView(APIView):
        def get(self, request):
            tags = ArticleTag.objects.all()
            serializer = ArticleTagSerializer(tags, many=True)
            return Response(serializer.data)
    
        def post(self, request):
            serializer = ArticleTagSerializer(data=request.data)
            if serializer.is_valid():
                serializer.save()
                return Response(serializer.data, status=status.HTTP_201_CREATED)
            return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST)
    

     

  • プロジェクト名/setting.py

    下記のようにINSTALLED_APPSにrest_frameworkとアプリ名を追加する。

    setting.py
    INSTALLED_APPS = [
        ...
        'rest_framework',
        'アプリ名',
    ]
    

    またページごとに返されるオブジェクト数を制限するために下記も追加しておく。

    setting.py
    REST_FRAMEWORK = {
        'DEFAULT_PAGINATION_CLASS': 'rest_framework.pagination.PageNumberPagination',
        'PAGE_SIZE': 10
    }
    

     

  • プロジェクト名/urls.py
    下記のように対応したパスを定義する。

    urls.py
    from django.urls import path
    from ..アプリ名.views import ArticleTagListView
    
    urlpatterns = [
        path('tags/', ArticleTagListView.as_view(), name='tag-list'),
    ]
    

 

所感

一つのAPIを作成するにも色々な書き方があるため理解しにくかったです。
実際の開発現場では管理が大変そうです。
本記事に間違いがあればご指摘ください。

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?