首页 > 解决方案 > 在 django rest 框架中过滤嵌套序列化器的查询集

问题描述

这是我的看法:

class SectorListAPI(generics.ListAPIView):
    queryset = SectorModel.objects.all()
    serializer_class = SectorSerializer

这是我的序列化程序:

class OrganizationSerializer(serializers.ModelSerializer):
class Meta:
    model = GroupProfile
    fields = ('title','slug',)



class DepartmentSerializer(serializers.ModelSerializer):
    organizations = OrganizationSerializer(many=True, read_only=True)
    class Meta:
        model = DepartmentModel
        fields = ('title', 'organizations',)


class SectorSerializer(serializers.ModelSerializer):
    # title = serializers.CharField()
    departments = DepartmentSerializer(many=True, read_only=True)

    class Meta:
        model = SectorModel
        fields = ('title','departments',)

看,这里的“SectorSerializer”是父“ DepartmentSerializer ”是孩子,“ OrganizationSerializer ”是孙子序列化器。现在在我看来,我可以轻松地为“ SectorModel ”过滤我的查询集。但是我如何过滤“ GroupProfile ”模型。

标签: pythondjangodjango-rest-framework

解决方案


您可能希望过滤查询集以确保仅返回与发出请求的当前经过身份验证的用户相关的结果。

您可以通过基于值的过滤来做到这一点request.user.

例如:

from myapp.models import Purchase
from myapp.serializers import PurchaseSerializer
from rest_framework import generics

class PurchaseList(generics.ListAPIView):
    serializer_class = PurchaseSerializer

    def get_queryset(self):
        """
        This view should return a list of all the purchases
        for the currently authenticated user.
        """
        user = self.request.user
        return Purchase.objects.filter(purchaser=user)

编辑

您可以继承 ListSerializer并覆盖该to_representation方法。

默认情况下,该to_representation方法调用data.all()嵌套查询集。因此,您实际上需要data = data.filter(**your_filters)在调用该方法之前进行。然后,您需要将您的子类 ListSerializer 添加为嵌套序列化程序元上的 list_serializer_class。

1-子类ListSerializer,覆盖to_representation然后调用super

2-在嵌套的序列化器上添加子类ListSerializer作为元。list_serializer_class

与您相关的代码:

class FilteredListSerializer(serializers.ListSerializer):

def to_representation(self, data):
    data = data.filter(user=self.request.user, edition__hide=False)
    return super(FilteredListSerializer, self).to_representation(data)


class OrganizationSerializer(serializers.ModelSerializer):
class Meta:
    list_serializer_class = FilteredListSerializer
    model = GroupProfile
    fields = ('title','slug',)



class DepartmentSerializer(serializers.ModelSerializer):
    organizations = OrganizationSerializer(many=True, read_only=True)
    class Meta:
        model = DepartmentModel
        fields = ('title', 'organizations',)


class SectorSerializer(serializers.ModelSerializer):
    # title = serializers.CharField()
    departments = DepartmentSerializer(many=True, read_only=True)

    class Meta:
    model = SectorModel
    fields = ('title','departments',)

推荐阅读