使用 Django Rest Framework 自定义 JSON 回调
Posted
技术标签:
【中文标题】使用 Django Rest Framework 自定义 JSON 回调【英文标题】:Custom JSON callback using Django Rest Framework 【发布时间】:2017-10-16 06:22:57 【问题描述】:我只是想使用https://jasonette.com/ 编写一个移动应用程序,但它希望每个响应的后端特定 JSON 格式,如下所示:
"$jason":
"head":
"title": " ˃̵̑ᴥ˂̵̑",
"actions":
"$foreground":
"type": "$reload"
,
"$pull":
"type": "$reload"
,
"body":
"header":
"style":
"background": "#ffffff"
出于测试目的,我序列化了常规 django_user 模型:
class UserSerializer(serializers.ModelSerializer):
class Meta:
model = User
fields = ('id', 'username', 'first_name', 'last_name', 'email')
它返回一个带有用户列表的 JSON 对象。但是如何使用附加值自定义此 JSON 并将其格式化为 Jasonette 想要的格式?
【问题讨论】:
【参考方案1】:序列化程序将处理对象实例到原始数据类型字典的转换,反之亦然(就像 django Form
)。如果要增加 JSON 响应,请覆盖相应的视图方法。例如,您可以在视图中执行以下操作:
from rest_framework.response import Response
class UserViewSet(ModelViewSet):
def retrieve(self, request, *args, **kwargs):
instance = self.get_object()
serializer = self.get_serializer(instance)
data = serializer.data
data.update("foo": "bar")
return Response(data)
【讨论】:
【参考方案2】:您可以通过覆盖序列化程序中的.to_representation()
方法来更改序列化行为:
class UserSerializer(serializers.ModelSerializer):
class Meta:
model = User
fields = ('id', 'username', 'first_name', 'last_name', 'email')
def to_representation(self, user):
data = super().to_representation(user) # the original data
return
'$jason':
'head':
# ...
,
'body': data,
# ...
【讨论】:
哇!太感谢了!在我的情况下,这是一个了不起的解决方案,但它只能返回一个项目而不是实体列表))例如,我的函数 def get(self, request, format=None): users = User.objects.all() 序列化程序= UserSerializer(users, many=True) return Response(serializer.data) ,没有“.to_representation()”返回对象列表,函数只有一项))以上是关于使用 Django Rest Framework 自定义 JSON 回调的主要内容,如果未能解决你的问题,请参考以下文章
Django Rest Framework 和 django Rest Framework simplejwt 两因素身份验证
18-Django REST framework-使用Django开发REST 接口
如何在 django-rest-framework 中为 API 使用 TokenAuthentication
Django-rest-framework 和 django-rest-framework-jwt APIViews and validation Authorization headers