Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/django/21.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 如何从Django rest框架的序列化程序中获取特定字段_Python_Django_Django Rest Framework - Fatal编程技术网

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

Python 如何从Django rest框架的序列化程序中获取特定字段,python,django,django-rest-framework,Python,Django,Django Rest Framework,在Inside 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 ser

在Inside 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
class ServerSerializer(serializers.HyperlinkedModelSerializer):
   class Meta:
        model = Server
        # fields = '__all__'
        fields = ('id', 'name', 'desc', 'ip_address')
在serializers.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
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_字段名称:

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):
覆盖序列化程序中的get_字段名称:

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):

谢谢您的回答,但是当我没有将上下文作为参数传递时,错误提示超级参数1必须是type,而不是ServerSerializer,如果上下文没有,我如何显示所有字段passed@GaryNg也许可以尝试上下文而不是上下文。此属性应始终存在。我的意思是,如果我键入serializer=serializer=ServerSerializerservers,则返回superself。get_field_names*args,**kwargs将抛出异常作为上面的注释。使用superServerSerializer,self而不是superself。是的,如果我将其添加到ServerSerializer类中,我要做的是为这类序列化程序实现父类,你能告诉我怎么做吗?谢谢你的回答,但当我不将上下文作为参数传递时,错误提示超级参数1必须是type,而不是ServerSerializer,如果上下文没有显示,如何显示所有字段passed@GaryNg也许可以尝试上下文而不是上下文。此属性应始终存在。我的意思是,如果我键入serializer=serializer=ServerSerializerservers,则返回superself。get_field_names*args,**kwargs将抛出异常作为上面的注释。使用superServerSerializer,self而不是superself。是的,如果我将其添加到ServerSerializer类中,我尝试做的是为这种序列化程序实现父类,您介意告诉我如何做吗?