如何使用Django REST Framework将额外的过滤器应用于嵌套的序列化程序?

时间:2015-04-10 16:11:11

标签: python django django-rest-framework

我正在构建一个必须处理嵌套的多对多字段的序列化程序。我设置了一系列序列化器,但它并没有完全符合我的需要。它创建的JSON看起来像这样:

"course_section": {
    "id": 6,
    "periods": [
        {
            "id": 3, 
            "coursemeet_set": [
                {
                    "id": 4, 
                    "period": 3, 
                    "course_section": 9,
                }, 
                {
                    "id": 8, 
                    "period": 3, 
                    "course_section": 6
                }, 
                {
                    "id": 9,
                    "period": 3, 
                    "course_section": 6
                },
            ], 
            "name": "Second Period"
        }
    }
}

这就是我期望Django REST Framework输出的内容 - 显示所有匹配句点3的CourseMeets。但是,在上面这个JSON输出的情况下,嵌套集合的course_section的ID为6,因此我只需要在其中包含"course_section": 6的coursemeets。

我花了一些时间在this question,我能够创建一个几乎完成我想要的自定义ListSerializer:

class FilteredCourseMeetSerializer(serializers.ListSerializer):
    def to_representation(self, data):
        data = data.filter(period=3, course_section=6)
        return super(FilteredCourseMeetSerializer, self).to_representation(data)

class CourseMeetSerializer(serializers.ModelSerializer):
    class Meta:
        model = CourseMeet
        list_serializer_class = FilteredCourseMeetSerializer

class PeriodSerializer(serializers.ModelSerializer):
    coursemeet_set = CourseMeetSerializer(many=True)

    class Meta:
        model = Period

class SectionSerializer(serializers.ModelSerializer):
    periods = PeriodSerializer(many=True)

    class Meta:
        model = CourseSection

但是,正如您所看到的,我手动将periodcourse_section过滤器添加到data.filter,我需要能够根据SectionSerializer中的id传递这些过滤器以及PeriodSerializer中的ID。

我如何实现这一目标?我是否使用ListSerializer在正确的轨道上,或者有更简单的方法吗?

0 个答案:

没有答案