返回的数据是一个包含所有字段的列表。我希望将数据分隔在主列表内的不同列表中。例如,在今天之前的日期和今天之后的列表中过滤的数据列表。我可以编写两个端点,并在查询集中过滤数据,但这将需要两个单独的API调用。
视图集:
class StudyPageViewSet(viewsets.ModelViewSet):
"""
Study create, read, update, delete over API.
"""
model = Study
serializer_class = StudyPageSerializer
permission_classes = (IsAuthenticated, IsAuthorPermission,)
def get_queryset(self):
return Study.on_site.all()
序列化器:
class StudyPageSerializer(serializers.ModelSerializer):
class Meta:
model = Study
fields = ('id', 'title', 'date', 'location')
read_only_fields = ('id',)
结果应为:
[
{
"list_before_today":[
{
"id":"5001",
"title":"None"
},
{
"id":"5002",
"title":"Glazed"
},
]
},
{
"list_after_today":[
{
"id":"5003",
"title":"None"
},
{
"id":"5004",
"title":"Glazed"
},
]
},
]
当前输出:
[
{
"id": 588,
"title": "title",
.. : ..
},
{
"id": 590,
"title": "title2",
.. : ..
},
]
ps。点代表其他字段。
答案 0 :(得分:1)
默认情况下,当您在ModelViewSet
视图中调用GET请求时,它将调用list
方法。在列表方法内部,Rest框架确实使用Model
创建了一个查询集来查询数据,然后将其传递到Serializer
中以序列化数据然后返回它,这就是为什么要这样做:
[
{
"id": 588,
"title": "title",
.. : ..
},
{
"id": 590,
"title": "title2",
.. : ..
},
]
因此,要获得预期的响应,您必须重写该list
方法以获取具有预期格式的响应,如下所示:
from datetime import date
from rest_framework import status
class StudyPageViewSet(viewsets.ModelViewSet):
"""
Study create, read, update, delete over API.
"""
model = Study
serializer_class = StudyPageSerializer
permission_classes = (IsAuthenticated, IsAuthorPermission,)
def get_queryset(self):
return Study.on_site.all()
def list(self, request):
queryset = self.get_queryset()
today = date.today()
output = [{
"list_before_today": self.get_serializer(queryset.filter(date__lt=today), many=True).data
}, {
"list_after_today": self.get_serializer(queryset.filter(date__gt=today), many=True).data
}]
return Response(output, status=status.HTTP_200_OK)
这只是个主意,因此您必须与代码保持一致才能使其正常工作。我也不建议您这样做,因为ModelViewSet
由Django Rest Framework很好地定义了,如果您想获得该响应,还可以创建另一个APIView来处理它。
希望有帮助!