如何使用模型字段过滤 serializers.SlugRelatedField 查询集

A. *_*arr 6 django serialization django-rest-framework

我无法使用queryset参数过滤 SlugRelatedField 的可能选项。这是我的序列化程序

class AttendeeProfileSerializer(serializers.HyperlinkedModelSerializer):
    """
    Profile Serializer
    """
    user = serializers.SlugRelatedField(slug_field='username', queryset=User.objects.all())
    module = serializers.SlugRelatedField(slug_field='id', queryset=AttendeeModule.objects.all())
    picture = serializers.ImageField(allow_empty_file=False, required=False)

    class Meta:
        model = AttendeeProfile
        fields = (
            'user', 'module', 'title', 'company', 'email', 'picture', 'is_active', 'created'
        )
Run Code Online (Sandbox Code Playgroud)

我想过滤模块字段,一个 laserializers.SlugRelatedField(slug_field='id', queryset=AttendeeModule.objects.filter(module__app='module__app')或类似的东西,其中每个模块都属于一个应用程序。

我想我需要通过视图为序列化程序提供更多上下文?我应该覆盖视图上的方法吗?我已经尝试过,但我对 Django rest 框架还是个新手,这给我带来了很多麻烦

观点是

class AttendeesList(generics.ListCreateAPIView):
    """

    """
    queryset = AttendeeProfile.objects.all()
    serializer_class = AttendeeProfileSerializer
Run Code Online (Sandbox Code Playgroud)

并使用这条路线

url(r'^apps/(?P<url_name>[a-z][a-z0-9]+)/modules/(?P<module_id>[0-9]+)/attendees$',
    views.AttendeesList.as_view(),
    name='attendees-list'),
Run Code Online (Sandbox Code Playgroud)

A. *_*arr 5

所以我找到了一个古老问题的解决方案:

class SlugRelatedModuleField(SlugRelatedField):

    def get_queryset(self):
        queryset = self.queryset
        if hasattr(self.root, 'app_id'):
            queryset = queryset.filter(module__app_id=self.root.app_id)
        return queryset

class AttendeeProfileSerializer(ModelSerializer):

    def __init__(self, *args, **kwargs):
        self.app_id = kwargs.pop('app_id')
        super().__init__(*args, **kwargs)

    module = SlugRelatedModuleField(
        slug_field='id', 
        queryset=AttendeeModule.objects.all()
    )

    class Meta:
        model = AttendeeProfile
        fields = ('user', 'module', 'title', 'company', 'email', 'picture', 'is_active', 'created')
Run Code Online (Sandbox Code Playgroud)

这会app_id在父/根序列化器上分配一个属性,并且 SlugRelatedModuleField 检查父级以过滤查询集。多田。