【问题标题】:Customize Django Serializer output with to_representation使用 to_representation 自定义 Django Serializer 输出
【发布时间】:2019-03-07 05:25:21
【问题描述】:

我想添加状态并将序列化器的输出放入数据中:

我的模特:

class UserDetails(models.Model):
    user = models.OneToOneField(User,on_delete=models.CASCADE)
    user_group_id = models.ForeignKey(UserGroup, on_delete=models.CASCADE)
    admin_photo = models.ImageField(upload_to='user_image',blank=True)

我的序列化器:

class UserDetailSerializer(serializers.ModelSerializer):
   user = serializers.StringRelatedField(many=False)
   user_group_id = serializers.StringRelatedField(many=False)
   class Meta:
      model = UserDetails
      fields = [
         'user',
         'user_group_id',
         'admin_photo',
      ]
      depth = 1

  def to_representation(self, instance):
      data = super(UserDetailSerializer, self).to_representation(instance)
      return {
            'STATUS' : 'SUCCESS',
            'DATA' : data 
        }

我得到的回应是这样的:

[
    {
        "DATA": {
            "user": "user1",
            "user_group_id": "Super Admin",
            "admin_photo": "http://www.someurl.com/media/22-black-wallpaper.jpg"
        },
        "STATUS": "SUCCESS"
    },
    {
        "DATA": {
            "user": "user2",
            "user_group_id": "Admin",
            "admin_photo": "http://www.someurl.com/media/fox.jpg"
        },
        "STATUS": "SUCCESS"
    }
]

但我想要这样的响应,状态是基本文本,我想将 Class meta 的结果放入 DATA

{
    "STATUS": "SUCCESS",
    "DATA": [
       {
          "user": "user1",
          "user_group_id": "Super Admin",
          "admin_photo": "http://www.someurl.com/media/22-black- 
                          wallpaper.jpg"
       },
       {
          "user": "user2",
          "user_group_id": "Admin",
          "admin_photo": "http://www.someurl.com/media/fox.jpg"
       }
     ]
 }

已编辑 仅使用 listapiview 查看并使用序列化程序类:

class UserListView(generics.ListAPIView):
    lookup_vield = 'id'
    serializer_class = UserDetailSerializer

    def get_queryset(self):
       return UserDetails.objects.all()

【问题讨论】:

  • 首先,STATUS 是什么意思?会有多个Status的机会吗?
  • 此外,请添加您当前的视图
  • @JPG 成功或失败
  • 是否有机会在一个响应中出现多个状态
  • @JPG 没有单一的状态,成功或失败

标签: python django python-3.x django-rest-framework


【解决方案1】:

您无法在序列化程序级别执行此操作,但可以通过覆盖 UserListViewlist(...) 方法在视图级别执行此操作
第 1 步。从 UserDetailSerializer 序列化程序
步骤 2 中删除 to_representation 方法。覆盖 list() 视图方法

class UserListView(generics.ListAPIView):
    lookup_vield = 'id'
    serializer_class = UserDetailSerializer

    def get_queryset(self):
        return UserDetails.objects.all()

    def list(self, request, *args, **kwargs):
        res = super(UserListView, self).list(request, *args, **kwargs)
        res.data = {"STATUS": "SUCCESS", "DATA": res.data}
        return res

【讨论】:

  • 如果您不介意再次帮助我,我该如何在 generics.RetriveAPIView 中实现这一点,因为当我使用 .retreive 时,它​​不像 .list 示例: res = super(UserListView, self).retreive (request, *args, **kwargs) res.data = {"STATUS": "SUCCESS", "DATA": res.data} return res
  • 你必须重写 retrive(...) 方法而不是 list(..) 方法
  • 很好用,再次感谢,看来我只是错误地输入了 retreive 大声笑
猜你喜欢
  • 2011-07-25
  • 1970-01-01
  • 1970-01-01
  • 2010-12-15
  • 2013-01-13
  • 2016-12-08
  • 2020-05-19
  • 1970-01-01
  • 2016-03-15
相关资源
最近更新 更多