【问题标题】:How to dynamically change depth in Django Rest Framework nested serializers?如何在 Django Rest Framework 嵌套序列化程序中动态更改深度?
【发布时间】:2016-09-23 12:52:53
【问题描述】:

我有一组嵌套的序列化程序,它们在各自的 Meta 类上设置了 depth。我想根据传入视图的参数以编程方式更改深度。

class ResourceSerializer(serializers.ModelSerializer):
    type         = serializers.PrimaryKeyRelatedField(queryset=EntityType.objects.all())
    tags         = serializers.PrimaryKeyRelatedField(queryset=Tag.objects.all(), many=True)

    class Meta:
        model  = Resource
        fields = ('id', 'type', 'uri', 'tags', 'created_date')
        depth = 1

不幸的是,似乎没有办法在运行时覆盖depth 属性。我目前的解决方案是继承“浅”序列化程序并覆盖它们的 Meta 类以调整深度。

class ResourceNestedSerializer(ResourceSerializer):
    class Meta(ResourceSerializer.Meta):
        depth = 2

在我看来:

    if nested:
        serializer = ContainerNestedSerializer(containers, many=True)
    else:
        serializer = ContainerSerializer(containers, many=True)
    return Response(serializer.data)

在调用serializer.data之前有什么方法可以调整depth

【问题讨论】:

    标签: python django rest serialization django-rest-framework


    【解决方案1】:

    这是我的代码,其中包含/排除字段,以及动态调整深度。根据你的口味调整它。 :)

    class DynamicModelSerializer(serializers.ModelSerializer):
    """
    A ModelSerializer that takes an additional `fields` argument that
    controls which fields should be displayed, and takes in a "nested"
    argument to return nested serializers
    """
    
    def __init__(self, *args, **kwargs):
        fields = kwargs.pop("fields", None)
        exclude = kwargs.pop("exclude", None)
        nest = kwargs.pop("nest", None)
    
        if nest is not None:
            if nest == True:
                self.Meta.depth = 1
    
        super(DynamicModelSerializer, self).__init__(*args, **kwargs)
    
        if fields is not None:
            # Drop any fields that are not specified in the `fields` argument.
            allowed = set(fields)
            existing = set(self.fields.keys())
            for field_name in existing - allowed:
                self.fields.pop(field_name)
    
        if exclude is not None:
            for field_name in exclude:
                self.fields.pop(field_name)
    

    【讨论】:

    • 您只为 self.Meta.depth 分配了一个值 (1)。是不是搞错了?
    • depth ==1 表示扩展下一层,wikll 做同样的事情,因此无限递归,因此您的所有模型都将嵌套。
    猜你喜欢
    • 1970-01-01
    • 2016-02-09
    • 1970-01-01
    • 2023-03-26
    • 2017-01-28
    • 1970-01-01
    • 2018-10-26
    • 1970-01-01
    • 2015-04-17
    相关资源
    最近更新 更多