重命名响应字段 django rest framework 序列化程序

Rename response fields django rest framework serializer

我正在调用一个简单的 get API 使用 djangorestframework。我的模特是

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"
    }
]

我想更改响应字段名称,因为它仅适用于我的数据库,不想在响应中透露。如果我在序列化程序 class 中更改名称,则不会出现字段匹配错误。

我还想在响应对象中自定义其他参数,如上面的响应,消息和状态如下。

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

需要适当的指导和流程。高手帮忙

您可以覆盖 serializer.Check 中的 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

您可以将其包裹在 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 用于不同名称的序列化。

首先 在字段名称中使用 category_ 是多余的。因为您已经将这些字段分配给 Category 模型,并且通过这样做您正在为这些字段创建 "namespace"。

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

第二个 在 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)

在 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')