我正在使用Django Rest框架开发API,我想动态删除序列化程序中的字段。问题是我需要根据另一个字段的值删除它们。我怎么能这样做? 我有一个序列化器,如:
class DynamicSerliazer(serializers.ModelSerializer):
type = serializers.SerializerMethodField()
url = serializers.SerializerMethodField()
title = serializers.SerializerMethodField()
elements = serializers.SerializerMethodField()
def __init__(self, *args, **kwargs):
super(DynamicSerliazer, self).__init__(*args, **kwargs)
if self.fields and is_mobile_platform(self.context.get('request', None)) and "url" in self.fields:
self.fields.pop("url")
正如您所看到的,我已经删除了该字段" url"取决于请求是否已从移动平台完成。但是,我想删除"元素"字段取决于"类型"值。我该怎么做?
提前致谢
答案 0 :(得分:20)
您可以通过覆盖序列化程序中的to_representation()
方法来 customize the serialization behavior。
class DynamicSerliazer(serializers.ModelSerializer):
def to_representation(self, obj):
# get the original representation
ret = super(DynamicSerializer, self).to_representation(obj)
# remove 'url' field if mobile request
if is_mobile_platform(self.context.get('request', None)):
ret.pop('url')
# here write the logic to check whether `elements` field is to be removed
# pop 'elements' from 'ret' if condition is True
# return the modified representation
return ret
答案 1 :(得分:4)
您可以创建多个序列化程序并在视图中选择正确的序列化程序
class IndexView(APIView):
def get_serializer(self):
if self.request.GET['flag']:
return SerializerA
return SerializerB
使用继承来使序列化程序DRY。
答案 2 :(得分:0)
我的问题与你的问题有些类似,我用继承解决了这个问题。
class StaticSerializer(serializers.ModelSerializer):
class Meta:
model = StaticModel
fields = (
'first_name', 'last_name', 'password', 'username',
'email'
)
class DynamicSerializer(StaticSerializer):
class Meta:
model = StaticModel
fields = (
'first_name',
)