DRF 02 setting


Intro
私たちは「どう」で「何」と答えるかに重点を置きます.
HTMLレスポンス
Djangoの応答方式を使用しています
ただし,HTML自体は構造化(整合性)文書であり,データ抽出には適していない.
次に、データ(情報)伝達に焦点を当てたJSONに応答するサーバを作成します.
JSONを手動で設定して応答する
フィールドを直接整理します.
ディクシャナでない場合は、safe=Falseパラメータを追加する必要があります.
from django.http.response import JsonResponse
from .Models import Article

def article_list_json_1(request):
    articles = Article.objects.all()
    articles_json = []

    for article in articles:
        articles_json.append({
            # 각 필드를 주석 처리
            'id': article.id,
            'title': article.title,
            'content': article.content,
            'created_at': article.created_at,
            'updated_at': article.updated_at,
                    })
        return JsonResponse(articles_json, safe=False)
1 Django core serializers応答
フィールドを直接構成するのではなく、articles QuerySet情報を用いてシリアル化する.HttpResponseは、content_typeのキーワードファクタを使用して、任意の値を超えなければtext/htmlをデフォルト値として使用する複数のタイプの回答を行うことができる.
# articles/views.py

from django.http.response import JsonResponse, HttpResponse
from django.core import serializers
from .models import Article

def article_list_json_2(request):
    articles = Article.objects.all()
    data = serializers.serialize('json', articles)
    # print(type(data)) str
    return HttpResponse(data, content_type='application/json')
2 DRF応答
DRFを利用します.
$ pip install djangorestframework
# settings.py

INSTALLED_APPS = [
        ...
        'rest_framework',
]
# articles/serializers.py

from rest_framework import serializers
from .models import Article

class ArticleSerializer(serializers.ModelSerializer):

    class Meta:
        model = Article
        fields = ('title', 'content', 'created_at', 'updated_at',)
        # fields = '__all__'
# articles/views.py

from rest_framework.response import Response
from .serializers import ArticleSerializer

def article_list_json_3(request):

    # 직렬화 할 데이터 DB에서 가져오기
    articles = Article.objects.all()

    # ArticleSerializer를 통해 직렬화하기 (QuerySet이라서 many=True 옵션 필수)
    serializer = ArticleSerializer(articles, many=True)
    return Response(serializer.data)