使用 Django Rest Framework 的自定义 JSON 回调
Custom JSON callback using Django Rest Framework
我只是想使用 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')
它 returns 一个带有用户列表的 JSON 对象。但是我如何使用其他值自定义此 JSON 并将其格式化为 Jasonette 想要的格式?
序列化程序将处理对象实例到原始数据类型字典的转换,反之亦然(就像 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)
您可以通过重写序列化程序中的 .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,
# ...
}
}
我只是想使用 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')
它 returns 一个带有用户列表的 JSON 对象。但是我如何使用其他值自定义此 JSON 并将其格式化为 Jasonette 想要的格式?
序列化程序将处理对象实例到原始数据类型字典的转换,反之亦然(就像 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)
您可以通过重写序列化程序中的 .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,
# ...
}
}