python - 如何在 django rest 框架中序列化多个查询集?
问题描述
我有两个相互关联的模型。一个代表一个项目,另一个代表该项目所属的领域/区域。
我有一个看起来像这样的视图:
class ProjetosArea(generics.ListAPIView):
lookup_field = 'id'
serializer_class = ProjetosPreviaSerializer
pagination_class = ProjectPagination
def get_queryset(self):
area_id = self.kwargs['id']
area = AreaConhecimento.objects.get(id=area_id)
projetos = Projeto.objects.filter(area_conhecimento=area_id)
queryset = [area, projetos]
return queryset
我想为此视图编写一个序列化程序,如下所示:
{
"area": {---fields of the area---},
"projects": [---The projects that belongs to that area---]
}
如何为此编写序列化程序?查询集是一个包含该区域和属于该区域的项目的列表
解决方案
这get_queryset
看起来不对。这个想法是在那里返回一个查询集以在那里执行权限检查等。你不应该像这样返回两个资源。
虽然如果您需要它 - 代码只是一个工具。随心所欲地使用它。
我建议保持get_queryset
原样并覆盖list
方法,因为那是您真正想要做的。因为您要返回两个资源,所以它需要知道如何处理它们。
从示例中,我推断area_conhecimento
为 area pk
。所以这样的事情应该有效。
class ProjetosArea(generics.ListAPIView):
lookup_field = 'area_conhecimento'
serializer_class = ProjetosAreaSerializer
pagination_class = ProjectPagination
def list(self, request, *args, **kwargs):
qs = self.filter_queryset(self.get_queryset())
area = qs.first().area_conhecimento
# you will have to adjust it for pagination
serializer = self.get_serializer({
'projects': qs,
'area': area
})
return Response(serializer.data)
只是序列化器就这么简单。
from rest_framework import serializers
class AreaConhecimentoSerializer(serializers.ModelSerializer):
class Meta:
model = AreaConhecimento
fields = '__all__'
class ProjetoSerializer(serializers.ModelSerializer):
class Meta:
model = Projeto
fields = '__all__'
class ProjetosAreaSerializer(serializers.Serializer):
area = AreaConhecimentoSerializer(read_only=True)
projects = ProjetoSerializer(many=True, read_only=True)
但是您真正的问题是您实际上想要获得区域及其项目。所以就去做吧。你自己说The projects that belongs to that area
的。
class AreaRetrieveAPIView(RetrieveAPIView):
serializer_class = AreaSerializer
pagination_class = AreaPagination
class ProjetoSerializer(serializers.ModelSerializer):
class Meta:
model = Projeto
fields = '__all__'
class AreaSerializer(serializers.ModelSerializer):
projeto = ProjetoSerializer(many=True, read_only=True)
class Meta:
model = AreaConhecimento
fields = '__all__'
它会回来
{
"area": {
"projects": [---The projects that belongs to that area---],
---fields of the area---
},
}
推荐阅读
- javascript - 如何通过url发送长数据?
- android - 底部导航不显示原始颜色
- angular - Angular不会显示变量
- javascript - 为什么你是(Javascript算法挑战)
- java - 部署时包不存在
- http - Hiveserver2:无法启动 ThriftHttpCliService
- javascript - 通过调用 this.$refs 更改 vuejs 的 html 标题后,vuejs 之后不会更新该 html 元素
- javascript - Gatsby JS Build 带有断开的链接
- html - Angular [(ngModel)] 会检查所有复选框,尽管检查条件
- python-3.x - 只显示边界框区域而忽略其他部分