FVo*_*Vod 18 django-serializer django-rest-framework
我正在使用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")
Run Code Online (Sandbox Code Playgroud)
正如您所看到的,我已经删除了字段"url",具体取决于请求是否已从移动平台完成.但是,我想根据"类型"值删除"元素"字段.我该怎么办?
提前致谢
Rah*_*pta 23
您可以通过覆盖序列化程序中的to_representation()方法来自定义序列化行为.
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
Run Code Online (Sandbox Code Playgroud)
您可以创建多个序列化程序并在视图中选择合适的一个
class IndexView(APIView):
def get_serializer(self):
if self.request.GET['flag']:
return SerializerA
return SerializerB
Run Code Online (Sandbox Code Playgroud)
使用继承使序列化程序干燥。
| 归档时间: |
|
| 查看次数: |
8152 次 |
| 最近记录: |