[英]How to serialize mutiple querysets in django rest framework?
我有兩個相互關聯的模型。 一個代表一個項目,另一個代表該項目所屬的領域/區域。
我有一個看起來像這樣的視圖:
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---
},
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.