在Django睡觉框架中,当序列化程序嵌套在另一个序列化程序中时,如何过滤它?

我的过滤器被强加在DRF视图集中,但是当您从另一个序列化程序内部调用一个序列化程序时,嵌套的序列化程序的视图集永远不会被调用,因此嵌套的结果显示为未过滤.

我曾try 在原始视图集上添加过滤器,但它似乎无法过滤嵌套结果,因为嵌套结果会作为单独的预处理查询调用.(您可以看到,嵌套序列化程序是反向查找.)

是否可以在嵌套的序列化程序本身中添加getqueryset()覆盖(将其移出视图集),以便在那里添加过滤?我也试过了,但没有成功.

这就是我试过的,但似乎没有人叫它:

class QuestionnaireSerializer(serializers.ModelSerializer):
    edition = EditionSerializer(read_only=True)
    company = serializers.StringRelatedField(read_only=True)

    class Meta:
        model = Questionnaire

    def get_queryset(self):
        query = super(QuestionnaireSerializer, self).get_queryset(instance)
        if not self.request.user.is_staff:
            query = query.filter(user=self.request.user, edition__hide=False)
        return query

推荐答案

可以将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.context['request'].user, edition__hide=False)
        return super(FilteredListSerializer, self).to_representation(data)


class EditionSerializer(serializers.ModelSerializer):

    class Meta:
        list_serializer_class = FilteredListSerializer
        model = Edition


class QuestionnaireSerializer(serializers.ModelSerializer):
    edition = EditionSerializer(read_only=True)
    company = serializers.StringRelatedField(read_only=True)

    class Meta:
        model = Questionnaire

Django相关问答推荐

如何在Django中更改模型字段名称?

Djnago admin中 Select 字段的自定义查询

通过在其他查询中使用来过滤对象

Django 中主键的隐式 UUID 自动字段

情节主题更改问题

Django REST框架中如何从另一个视图调用API视图?

Pytest-django - 测试创建和传递所需的用户对象

使用django提交后如何保留html表单数据?

Django 模板文件夹

Django 模型中的隐藏字段

多租户 Django 应用程序:根据请求更改数据库连接?

如何迭代模板中 SelectField 的选项?

如何按名称设置 django 模型字段?

Python 社区里的小马是怎么回事?

Django unique_together 与可为空的 ForeignKey

'function' 对象没有属性 'as_view'

RemovedInDjango18Warning:不推荐创建没有fields属性或 exclude属性的 ModelForm

基于 User-Agent 更改 Django 模板

Django将整数模型字段的范围设置为约束

Django 字符串到日期格式