【问题标题】:Exclude declared serializer fields in Django Rest Framework排除 Django Rest Framework 中声明的序列化程序字段
【发布时间】:2020-01-19 01:21:03
【问题描述】:

在我的项目中,我刚刚将 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


    【解决方案1】:

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

    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`
    

    这样您就不必创建子类。

    【讨论】:

    • 效果很好,非常感谢,比预期的要容易得多。
    猜你喜欢
    • 1970-01-01
    • 2019-07-20
    • 2013-11-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-11-16
    • 2013-07-07
    相关资源
    最近更新 更多