【问题标题】:How to pull nested fields out when serializing -- Django Rest Framework序列化时如何拉出嵌套字段——Django Rest Framework
【发布时间】:2015-07-09 08:45:48
【问题描述】:

我有一个如下所示的序列化模型:

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

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

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

我想这样做的原因是我可以使用 django 过滤器来过滤 group_name。

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

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

提前感谢您!

【问题讨论】:

标签: django api rest django-rest-framework


【解决方案1】:

您可以使用序列化器字段的源属性将相关的对象字段带到顶层。

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

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

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

【讨论】:

    【解决方案2】:

    过滤器与模型有关,而不是它的序列化器版本,因此即使您将在序列化器输出中创建字段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
    

    【讨论】:

    • 我相信这应该是obj.group.group_name。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-06-07
    • 1970-01-01
    • 2021-12-16
    • 2015-03-27
    • 2016-01-03
    • 2018-05-20
    相关资源
    最近更新 更多