web-dev-qa-db-ja.com

応答フィールドの名前を変更Django残りのフレームワークシリアライザー

Djangorestframeworkを使用して単純なgetAPIを呼び出しています。私のモデルは

class Category(models.Model):
    category_id = models.AutoField(primary_key=True)
    category_name = models.CharField("Category Name", max_length = 30)
    category_created_date = models.DateField(auto_now = True, auto_now_add=False)
    category_updated_date = models.DateField(auto_now = True, auto_now_add=False)

    def __str__(self):
        return self.category_name

serializer.py

class CategorySerializer(serializers.ModelSerializer) :
    class Meta:
        model = Category
        fields = ['category_id', 'category_name']

def category_list(request):
    if request.method == 'GET':
        categories = Category.objects.all()
        serializer = CategorySerializer(categories, many=True)
        return Response(serializer.data)

URLでリクエストをヒットし、次の応答を返すと、正常に機能しています。

[
    {
        "category_id": 1,
        "category_name": "ABC"
    }
]

dB専用であるため、応答フィールド名を変更したいのですが、応答として開示したくありません。シリアライザークラスの名前を変更すると、フィールド一致エラーは発生しません。

また、以下のようなメッセージとステータスを持つ応答オブジェクトで、上記の応答のような他のパラメータをカスタマイズしたいと思います。

{
status : 200,
message : "Category List",
response : [
        {
            "id": 1,
            "name": "ABC"
        }
    ]
}

適切なガイドとフローが必要です。専門家がお手伝いします。

7
Pinank Lakhani

最初にフィールド名にcategory_を使用することは冗長です。すでにこのフィールドをCategoryモデルに割り当てており、これを行うことで、このフィールドの「名前空間」を作成しているためです。

class Category(models.Model):
    id = models.AutoField(primary_key=True)
    name = models.CharField("Category Name", max_length = 30)
    created_date = models.DateField(auto_now = True, auto_now_add=False)
    updated_date = models.DateField(auto_now = True, auto_now_add=False)

    def __str__(self):
        return self.name

SecondIn Django id AutoFieldは自動的に作成されます。なぜ明示的に設定する必要があるのですか?

そしてあなたの質問に答えるシリアライザーフィールドに source パラメーターがあります。

class CategorySerializer(serializers.ModelSerializer):
    renamed_id = serializers.IntegerField(source='category_id')
    renamed_name = serializers.CharField(source='category_name')

    class Meta:
        model = Category
        fields = ['renamed_id', 'renamed_name']

そして、あなたが手動であなたの応答を変えることができるより

from rest_framework import status

def category_list(request):
    if request.method == 'GET':
        categories = Category.objects.all()
        serializer = CategorySerializer(categories, many=True)
        response = {
            'status': status.HTTP_200_OK,
            'message' : "Category List",
            'response' : serializer.data
        }
        return Response(response)
20

シリアライザーのto_representation関数をオーバーライドできます。次のコードを確認して、必要に応じてdata辞書を更新できます。

class CategorySerializer(serializers.ModelSerializer) :
    class Meta:
        model = Category
        fields = ['category_id', 'category_name']
    def to_representation(self, instance):
        data = super(CategorySerializer, self).to_representation(instance)
        result_data={"status" : 200,"message" : "Category List"}
        result_data["response"]=data
        return result_data
2
Himanshu dua

jsonでまとめることができます。これはあなたが望むようにレンダリングする方法です:

from Django.http import HttpResponse
import json

def category_list(request):
    if request.method == 'GET':
        categories = Category.objects.all()
        serializer = CategorySerializer(categories, many=True)
        response = {'code: 200, 'message': 'Category List', 'response': serializer.data}
        return HttpResponse(json.dumps(response), mimetype='application/json')

これは、フィールドの名前を変更する方法です。

class CategorySerializer(serializers.ModelSerializer):
    name = serializers.CharField(source='category_name')

    class Meta:
        model = Category
        fields = ['category_id', 'name']

これは、異なる名前でシリアル化するための docs です。

2
vishes_shell

Django 2.1.1で、ビューセットを使用している場合は、次のように.list()アクションをオーバーライドすることで、応答の他の部分をカスタマイズできます。

from rest_framework import status
from Django.http import HttpResponse
import json

class CategoryViewset(viewsets.ReadOnlyModelViewSet):
    categories = Category.objects.all()

    def list(self, request):
        if request.method == 'GET':
            serializer = CategorySerializer(self.categories, many=True)
            response = {
                'status': status.HTTP_200_OK,
                'message' : "Category List",
                'response' : serializer.data,
            }
            return HttpResponse(json.dumps(response), content_type='application/json')
1
Jimmy98435