python - 如何从 Django rest 框架的序列化程序中获取特定字段

标签 python django django-rest-framework

在 Views.py 中,我有这些代码:

class ServerViewSet(viewsets.ViewSet):

def list(self, request):
    servers = Server.objects.all()
    serializer = ServerSerializer(servers, many=True) 
    return Response(serializer.data) # In here, I want to get the server name only

def retrieve(self, request, pk=None):
    servers = get_object_or_404(Server, pk=pk)
    serializer = ServerSerializer(servers)
    return Response(serializer.data) # In here, I want to get the server name and ip address

在 serializers.py 中,我有这些代码:

class ServerSerializer(serializers.HyperlinkedModelSerializer):
   class Meta:
        model = Server
        # fields = '__all__'
        fields = ('id', 'name', 'desc', 'ip_address')

有没有官方的方法从serializers.data中过滤掉特定的字段

带有父类的示例

class CommonSerializer(serializers.ModelSerializer):
def get_field_names(self, *args, **kwargs):
    field_names = self.context.get('fields', None)
    if field_names:
        return field_names
    return super(self).get_field_names(*args, **kwargs)

class ServerSerializer(CommonSerializer):
      class Meta:
        ..............

class WebsiteSerializer(CommonSerializer):
   class Meta:
        ..............

最佳答案

在序列化程序中覆盖 get_field_names:

class ServerSerializer(serializers.HyperlinkedModelSerializer):
    def get_field_names(self, *args, **kwargs):
        field_names = self.context.get('fields', None)
        if field_names:
            return field_names

        return super(ServerSerializer, self).get_field_names(*args, **kwargs)

然后像这样使用它:

serializer = ServerSerializer(servers, context={'fields': ['name']})

serializer = ServerSerializer(servers, context={'fields': ['name', 'ip_address']})

* 编辑 *

将它变成 mixin,使其更易于重用:

class FieldMixin(object):
    def get_field_names(self, *args, **kwargs):
        field_names = self.context.get('fields', None)
        if field_names:
            return field_names

        return super(FieldMixin, self).get_field_names(*args, **kwargs)

并使用它:

class ServerSerializer(FieldMixin, serializers.HyperlinkedModelSerializer):

关于python - 如何从 Django rest 框架的序列化程序中获取特定字段,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47119879/

相关文章:

python - 以变​​量作为参数的 django 自定义模板过滤器

django-rest-auth 错误 - save() 采用 1 个位置参数,但给出了 2 个

python - 将数据框 append 到空变量

python - 尝试通过 Twitter 预测用户的个性时,文本分类的准确性较低

python - Django 管理员 : Numeric field filter

python - Django 模型继承和类型检查

python - 如何将字符串 ['2019-06-01T23:07:02.000+0000' ] 转换为 Python 3 中的日期时间对象

python - 我如何按数组的行和/或列对平均值进行排序?

django - 使用 django 和 mongoengine 时出现 NotUniqueError

python - 如何在 django Rest_framework_csv 中设置 CSVRenderer 的分隔符?