簡體   English   中英

如何在 django rest 框架中序列化多個查詢集?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM