首页 > 解决方案 > 排除 Django Rest Framework 中声明的序列化程序字段

问题描述

在我的项目中,我刚刚将 Django Rest Framework 升级到了 3.6 版。以前,我能够排除在序列化程序上声明的字段,现在它阻止我这样做。

class MyModelSerializer(Serializer):
    expensive_field = SerializerMethodField()

    class Meta:
        model = MyModel
        exclude = ['expensive_field']

    def get_expensive_field(self, obj):
        return expensive_calculation()

我想这样做的原因是因为有一些方法字段计算起来相当昂贵,我只想在明确请求时呈现它们。

到目前为止的机制是排除这些字段。在fields请求中设置参数时,会动态创建从常规序列化程序继承的序列化程序。它包括先前排除的字段。

有没有办法使用最新版本的 DRF 来实现这一点?

(当然,我可以为每个这样的情况创建额外的序列化程序。但是,这不是通用的,不是 DRF 支持的东西,并且还需要每个视图的序列化程序的指数数量,具体取决于要排除的字段数量。)

标签: django-rest-framework

解决方案


您可以动态排除序列化程序构造函数上的字段,例如:

def __init__(self, *args, **kwargs):
    super().__init__(*args, **kwargs)
    if not self.must_include_expensive_field():
        self.fields.pop('expensive_field')

def must_include_expensive_field(self):
    # Do your check here. You can use `self.context['request'].query_params`
    # but keep in mind it might not be set in some unusual cases thus use `try`

这样您就不必创建子类。


推荐阅读