Django rest framework 动态序列化器字段的干式方法的设计模式
基本上,我想要实现的是,根据用户是否提供了他们感兴趣的字段列表,使序列化程序中的字段列表可以选择性地动态。 以下是我的DRF序列化程序的序列化程序:Django rest framework 动态序列化器字段的干式方法的设计模式,django-rest-framework,Django Rest Framework,基本上,我想要实现的是,根据用户是否提供了他们感兴趣的字段列表,使序列化程序中的字段列表可以选择性地动态。 以下是我的DRF序列化程序的序列化程序: class DynamicFieldsModelSerializer(serializers.ModelSerializer): def __init__(self, *args, **kwargs): super(DynamicFieldsModelSerializer, self).__init__(*args, **
class DynamicFieldsModelSerializer(serializers.ModelSerializer):
def __init__(self, *args, **kwargs):
super(DynamicFieldsModelSerializer, self).__init__(*args, **kwargs)
fields = self.context['request'].query_params.get('fields')
if fields:
fields = fields.split(',')
allowed = set(fields)
existing = set(self.fields.keys())
for field_name in existing - allowed:
self.fields.pop(field_name)
class MySerializer(serializer_mixins.DynamicFieldsModelSerializer, serializers.ModelSerializer):
# fields...
和我的序列化程序:
class DynamicFieldsModelSerializer(serializers.ModelSerializer):
def __init__(self, *args, **kwargs):
super(DynamicFieldsModelSerializer, self).__init__(*args, **kwargs)
fields = self.context['request'].query_params.get('fields')
if fields:
fields = fields.split(',')
allowed = set(fields)
existing = set(self.fields.keys())
for field_name in existing - allowed:
self.fields.pop(field_name)
class MySerializer(serializer_mixins.DynamicFieldsModelSerializer, serializers.ModelSerializer):
# fields...
这实现了不包括用户在queryset的fields
param中未提及的字段的目标。但是最后,我们对数据库进行实际查询,以获取整个字段集。反过来,只需向视图中添加以下代码即可解决此问题:
class Rfs(ListAPIView):
serializer_class = MySerializer
def get_queryset(self):
qs = ...
fields = request.query_params.get('fields')
if fields:
qs = qs.only(*fields.split(','))
return qs
但是,这里有两个问题:
- 非干式模式,因为我们必须在视图和序列化程序中重复自己
- 有时,可能是queryset中的字段名与模型的字段名不完全对应
查询参数
您的视图将被修改
得到
得到
我希望这就是您想要实现的。您是否尝试过创建动态url,例如
路径(my/own/uri//”…
,并且在您看来,您可以设置您的方法get(request,param1=None,param2=None)
?根据这一点,您可以将覆盖到_representation()