Django 如何使用ModelSerializer添加其他顶级JSON字段
我正在使用中的创建API。ModelSerializer可以很好地返回我在数据库中查询的任何内容的JSON列表。但是我需要在JSON响应的根级别有一些额外的字段。如何将查询结果提升到另一个级别,并在JSON对象的根位置添加自定义字段 这是API查询返回的结果:Django 如何使用ModelSerializer添加其他顶级JSON字段,django,django-rest-framework,Django,Django Rest Framework,我正在使用中的创建API。ModelSerializer可以很好地返回我在数据库中查询的任何内容的JSON列表。但是我需要在JSON响应的根级别有一些额外的字段。如何将查询结果提升到另一个级别,并在JSON对象的根位置添加自定义字段 这是API查询返回的结果: http200正常 允许:获取、头部、选项 内容类型:application/json 更改:接受 [ { “用户”:{ “用户名”:“myuser” }, “内容”:“另一条推特”, “时间间隔”:“2周3天”, “url”:“/twe
http200正常
允许:获取、头部、选项
内容类型:application/json
更改:接受
[
{
“用户”:{
“用户名”:“myuser”
},
“内容”:“另一条推特”,
“时间间隔”:“2周3天”,
“url”:“/tweet/3/”,
“id”:3
},
{
“用户”:{
“用户名”:“myuser”
},
“内容”:“推特”,
“时间间隔”:“2周3天”,
“url”:“/tweet/2/”,
“id”:2
}
]
这就是我想要的:
http200正常
允许:获取、头部、选项
内容类型:application/json
更改:接受
{
“自定义字段”:“自定义值”,
“结果”:[
{
“用户”:{
“用户名”:“myuser”
},
“内容”:“另一条推特”,
“时间间隔”:“2周3天”,
“url”:“/tweet/3/”,
“id”:3
},
{
“用户”:{
“用户名”:“myuser”
},
“内容”:“推特”,
“时间间隔”:“2周3天”,
“url”:“/tweet/2/”,
“id”:2
}
]
}
serializer.py:
from django.utils.timesince import timesince
from rest_framework import serializers
from tweets.models import Tweet
from accounts.api.serializers import UserDisplaySerializer
class TweetSerializer(serializers.ModelSerializer):
user = UserDisplaySerializer(read_only=True)
timesince = serializers.SerializerMethodField()
url = serializers.CharField(source='get_absolute_url', read_only=True)
class Meta:
model = Tweet
fields = [
'user',
'content',
'timesince',
'url',
'id',
]
def get_timesince(self, obj):
return timesince(obj.created)
views.py:
from django.db.models import Q
from rest_framework import generics
from rest_framework import exceptions
from rest_framework import permissions
from tweets.models import Tweet
from tweets.api import serializers
class TweetListAPIView(generics.ListAPIView):
serializer_class = serializers.TweetSerializer
def get_queryset(self, *args, **kwargs):
queryset = Tweet.objects.all()
queryset = queryset.order_by('-id')
return queryset
您可以通过覆盖
ListAPIView
的list
方法,然后将此新字段添加到响应中来完成此操作:
from rest_framework.response import Response
def list(self, request, *args, **kwargs):
queryset = self.get_queryset()
serializer = self.get_serializer(queryset, many=True)
response_data = {'custom_field': 'custom value',
'result': serializer.data}
return Response(response_data)
是的,行得通。必须导入rest\u framework.response.responseEyes。。编辑:)工作起来很有魅力!非常感谢。要固定字段的顺序,只需使用
collections
library中的orderedict
。此外,如果需要申请queryset,请检查此答案。