确定Django REST框架序列化程序是否在many=True的上下文中使用



我有一个Django REST框架序列化程序,它在很多地方都有使用。其中一个字段是SerializerMethodField,我只想在序列化程序仅用于序列化单个对象时包含它。基本上,当我有MySerializer(objects, many=True)时,我不想包含SerializerMethodField之一(或更改它的行为(。有什么办法吗?

Hi这里是我的解决方案,用于确定我们是否处于many=True的上下文中:我覆盖类方法,并添加一个";has_many";上下文kwargs对象的密钥:

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

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

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'字段

相关内容

最新更新