【问题标题】:Custom JSON callback using Django Rest Framework使用 Django Rest Framework 自定义 JSON 回调
【发布时间】: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 想要的格式?

【问题讨论】:

    标签: json django django-rest-framework django-serializer


    【解决方案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()”返回对象列表,函数只有一项))
      猜你喜欢
      • 2020-04-09
      • 2019-02-02
      • 2016-09-07
      • 1970-01-01
      • 1970-01-01
      • 2020-03-01
      • 1970-01-01
      • 2012-05-26
      • 1970-01-01
      相关资源
      最近更新 更多