Django rest framework 动态序列化器字段的干式方法的设计模式

Django rest framework 动态序列化器字段的干式方法的设计模式,django-rest-framework,Django Rest Framework,基本上,我想要实现的是,根据用户是否提供了他们感兴趣的字段列表,使序列化程序中的字段列表可以选择性地动态。 以下是我的DRF序列化程序的序列化程序: class DynamicFieldsModelSerializer(serializers.ModelSerializer): def __init__(self, *args, **kwargs): super(DynamicFieldsModelSerializer, self).__init__(*args, **

基本上,我想要实现的是,根据用户是否提供了他们感兴趣的字段列表,使序列化程序中的字段列表可以选择性地动态。 以下是我的DRF序列化程序的序列化程序:

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中的字段名与模型的字段名不完全对应
因此,也许有一些更优雅的Django本地解决方案可以用于此用例?

我正在使用

根据您的
查询参数
您的视图将被修改

得到

得到


我希望这就是您想要实现的。

您是否尝试过创建动态url,例如
路径(my/own/uri//”…
,并且在您看来,您可以设置您的方法
get(request,param1=None,param2=None)
?根据这一点,您可以将
覆盖到_representation()