django-rest-framework - 排除 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 支持的东西,并且还需要每个视图的序列化程序的指数数量,具体取决于要排除的字段数量。)
解决方案
您可以动态排除序列化程序构造函数上的字段,例如:
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`
这样您就不必创建子类。
推荐阅读
- c# - 进程完成后关闭 SQL 连接?
- angularjs - 如何将具有预定义参数的方法传递给 Angular JS 指令
- python - numpy 数据类型的问题?
- rmysql - 我的本地主机中有学生数据库,但它仍然显示这个
- kubernetes - 如何为 Kubernetes 集群中运行的所有不同应用程序设置单独的 DNS 端点???(AWS/GCP/天蓝色)
- android - 如何在 MoPub 中集成 Chartboost 中介?
- nginx - GRPC 流在写入之前关闭(通过 nginx 的 grpc_pass)
- reactjs - 如何描述何时在反应中使用术语“方法”与“功能”?
- python - 无法获取超链接href美汤
- flutter - 在 Flutter 的 SliverAppBar 中添加 AppBar