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