Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/303.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_Rest - Fatal编程技术网

Python Django REST指定查看列表时的字段

Python Django REST指定查看列表时的字段,python,django,rest,Python,Django,Rest,默认情况下,当询问模型列表(如/cars)时,django rest输出所有模型数据。我希望它在列表请求中只输出pk,在细节请求中输出完整的模型数据。我正在使用ModelSerializer和ModelViewSet 附言:设计上应该是这样的吗?提取这么多不需要的数据似乎是一种浪费。 谢谢:我定制了代码以满足我的需求。我创建了以下2个混音。让您的APIListView扩展FieldFilterMixin,让您的序列化程序扩展SerializerFieldSixin。在GET请求中使用逗号分隔的值

默认情况下,当询问模型列表(如/cars)时,django rest输出所有模型数据。我希望它在列表请求中只输出pk,在细节请求中输出完整的模型数据。我正在使用ModelSerializer和ModelViewSet

附言:设计上应该是这样的吗?提取这么多不需要的数据似乎是一种浪费。
谢谢:

我定制了代码以满足我的需求。我创建了以下2个混音。让您的APIListView扩展FieldFilterMixin,让您的序列化程序扩展SerializerFieldSixin。在GET请求中使用逗号分隔的值传递fl,以获取响应中所需的字段

class SerializerFieldsMixin(object):
    """
    Return only the fields asked for.
    Don't return any extra fields in serializer.
    """
    def get_fields(self):
        all_fields = super(SerializerFieldsMixin,self).get_fields()
        asked_fields = self.context.get('asked_fields')
        if not asked_fields:
            return all_fields
        all_fields = OrderedDict([(k,v) for k,v in all_fields.items() if k in asked_fields])
        return all_fields


class FieldFilterMixin(object):
    """
    To be used with List/Retrieve views.
    Set class attribute fields for the fields you want to display.
    Or override get_required_fields to customize.
    """

    def get_required_fields(self):
        if self.request.GET.has_key("fl"):
            return self.request.GET["fl"]
        return []

    def get_serializer_context(self):
        methods_to_act_on = ["GET","HEAD"]
        context = super(FieldFilterMixin,self).get_serializer_context()
        asked_fields = self.get_required_fields()
        if asked_fields and self.request.method in methods_to_act_on:
            context["asked_fields"] = asked_fields
        return context

我定制了代码以满足我的需求。我创建了以下2个混音。让您的APIListView扩展FieldFilterMixin,让您的序列化程序扩展SerializerFieldSixin。在GET请求中使用逗号分隔的值传递fl,以获取响应中所需的字段

class SerializerFieldsMixin(object):
    """
    Return only the fields asked for.
    Don't return any extra fields in serializer.
    """
    def get_fields(self):
        all_fields = super(SerializerFieldsMixin,self).get_fields()
        asked_fields = self.context.get('asked_fields')
        if not asked_fields:
            return all_fields
        all_fields = OrderedDict([(k,v) for k,v in all_fields.items() if k in asked_fields])
        return all_fields


class FieldFilterMixin(object):
    """
    To be used with List/Retrieve views.
    Set class attribute fields for the fields you want to display.
    Or override get_required_fields to customize.
    """

    def get_required_fields(self):
        if self.request.GET.has_key("fl"):
            return self.request.GET["fl"]
        return []

    def get_serializer_context(self):
        methods_to_act_on = ["GET","HEAD"]
        context = super(FieldFilterMixin,self).get_serializer_context()
        asked_fields = self.get_required_fields()
        if asked_fields and self.request.method in methods_to_act_on:
            context["asked_fields"] = asked_fields
        return context

您只需覆盖viewset的“list”方法即可获得如下所示的所需响应:

from rest_framework.response import Response

def list(self, request, *args, **kwargs):
    pks = []
    qs = self.get_queryset()
    for obj in qs:
        pks.append(obj.pk)
    return Response(data=pks)

您只需覆盖viewset的“list”方法即可获得如下所示的所需响应:

from rest_framework.response import Response

def list(self, request, *args, **kwargs):
    pks = []
    qs = self.get_queryset()
    for obj in qs:
        pks.append(obj.pk)
    return Response(data=pks)