如何在序列化时拉出嵌套字段 - Django Rest Framework

时间:2015-07-08 09:50:53

标签: django api rest django-rest-framework

我有一个类似于下面的序列化模型:

{
    name: "...."
    section: [
        {
            section_name: "..."
            group:[
                {"group_name": "..."}
            ]
        },
    ]
}

有什么方法可以在Django Rest Framework下提取group_name,以便:

{
    name: "...."
    section: [
        { section_name: "..."},
    ]
    group_name:[
        { group_name: "..." }
    ]
}

我之所以这样做,是因为我可以使用django过滤器来过滤group_name。

出于某种原因,我似乎无法使相关过滤器在django rest框架过滤器(第三方软件包:https://github.com/philipn/django-rest-framework-filters/blob/master/rest_framework_filters/filters.py)下工作,我正在寻找解决方法。

很想听到任何更好的方法来解决这个问题。

提前谢谢!

2 个答案:

答案 0 :(得分:1)

您可以使用序列化程序字段的source属性将相关对象字段置于顶层。

class MySerializer(serializers.ModelSerializer):
    group_name = serializers.CharField(source='section.group.group_name')

    class Meta:
        model = MyModel
        fields = ('group_name',)

但是,这不会消除提取相关对象的性能影响,因此仍需要在查询集上使用select_related和prefetch_related以获得最佳性能。

答案 1 :(得分:0)

过滤器与模型有关,而与其序列化器版本无关,因此即使您在序列化器输出中创建字段group_name - 它也无助于过滤。实际上,我建议您发布有关RelatedFilter的问题。

回答你的问题:

您可以使用SerializerMethodField向对象表示添加自定义字段。

class MyModelSerializer(serializers.ModelSerializer):
    group_name = serializers.SerializerMethodField()

    class Meta:
        model = MyModel

    def get_group_name(self, obj):
        return obj.group_name