为了账号安全,请及时绑定邮箱和手机立即绑定

确定 Django REST Framework 序列化器是否在 Many=True 的上下文中使用

确定 Django REST Framework 序列化器是否在 Many=True 的上下文中使用

PIPIONE 2023-07-18 10:23:06
我有一个 Django REST Framework 序列化器,在多个地方使用。其中一个字段是 SerializerMethodField,我只想在序列化器仅用于序列化单个对象时包含它。基本上,当我拥有该MySerializer(objects, many=True). 有什么想法如何做到这一点?
查看完整描述

2 回答

?
哔哔one

TA贡献1854条经验 获得超8个赞

您好,这是我的解决方案,用于确定我们是否处于 Many=True 的上下文中:我重写新的类方法并向上下文 kwargs 对象添加一个“has_many”键:


    class MySerializer(serializer.ModelSerializer):


        def __new__(cls, *args, **kwargs):

            if kwargs.get('many', False) is True:

                context = kwargs.get('context', {})

                context.update({'has_many': True})

                kwargs.update({'context': context})


            return super().__new__(cls, *args, **kwargs)


        def __init__(self, *args, **kwargs):

            super().__init__(*args, **kwargs)

            if self.context.get('has_many', False):

                # Do something


查看完整回答
反对 回复 2023-07-18
?
狐的传说

TA贡献1804条经验 获得超3个赞

从序列化器中动态删除字段的一种简单方法是将以下代码添加到序列化器中:


class MySerializer(serializer.ModelSerializer):

    def __init__(self, *args, **kwargs):

        remove_fields = kwargs.pop('remove_fields', None)

        super(MySerializer, self).__init__(*args, **kwargs)


        if remove_fields:

            # for multiple fields in a list

            for field_name in remove_fields:

                self.fields.pop(field_name, None)

然后,当您需要从序列化器中删除某些字段时,请使用它将从输出数据中MySerializer(objects, many=True, remove_fields=['list_of_your_fields',])删除' 字段list_of_your_fields


查看完整回答
反对 回复 2023-07-18
  • 2 回答
  • 0 关注
  • 87 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信