我使用djangorestframework调用一个简单的get API。我的模型是
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)
当我点击网址上的请求并返回以下回复时,它正常工作。
[
{
"category_id": 1,
"category_name": "ABC"
}
]
我想更改响应字段名称,因为它仅适用于我的数据库,并且不希望在回复时进行披露。如果我在序列化程序类中更改名称,而不是没有字段匹配错误。
此外,我想在响应对象中自定义其他参数,如上面的响应,消息和状态如下所示。
{
status : 200,
message : "Category List",
response : [
{
"id": 1,
"name": "ABC"
}
]
}
需要适当的指导和流程。专家帮忙。
答案 0 :(得分:18)
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
第二次在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)
答案 1 :(得分:2)
您可以在序列化程序中覆盖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 :(得分:1)
您可以将其打包在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。
答案 3 :(得分:1)
在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')