python - DRF - 动态添加字段 - (第一次有效,然后抛出错误)
问题描述
我想修改一个serializer
这样的,它包含FIELD_display
有任何选择的每个字段的字段,值为get_FIELD_display
.
我正在尝试在__init__
方法中动态添加这些字段并且它可以工作,但是刷新后它会引发错误:
Field name `ownership_display` is not valid for model `RealEstate`.
串行器
class ApiRealestateSerializer(serializers.ModelSerializer):
class Meta:
model = RealEstate
fields = [x.name for x in RealEstate._meta.fields]
def __init__(self, instance=None, data=None, **kwargs):
super().__init__(instance, data, **kwargs)
self.set_display_fields()
def set_display_fields(self):
"""adds FIELD_display field for every CharField (eg. name = "peter", name_display = "Peter" )"""
for field in RealEstate._meta.fields:
if field.choices:
fieldname = f"{field.name}_display"
self.fields[fieldname] = serializers.CharField(source=f'get_{field.name}_display')
self.Meta.fields.append(fieldname)
你知道如何让它工作吗?
解决方案
我注意到的第一件事是您在设置显示字段super().__init__
之前调用,因此父类方法可能会抛出该错误,因为当它检查它们尚不存在的字段时,但您没有发布完整的回溯,您发布的内容不足以让我复制。
最好准确地告诉我们您真正想要什么,因为您为该序列化程序所使用的模式看起来……不好。
推荐阅读
- javascript - 如何在没有输入文件的情况下创建复制到剪贴板图标?
- javascript - 通过 if/else 语句使用 JavaScript 事件侦听器更改 CSS 属性
- apache-kafka - Quarkus 中的 Kafka 背压
- flutter - 在flutter中使用getX打开页面时自动调整页面的语言
- histogram - 使用 Prometheus 跟踪两个请求之间的时间
- python - 加入和分组 2 个数据帧
- wordpress - 为什么使用修改后的 $price 调用 woocommerce_variation_prices_price 过滤器时,将 sale_price 设置为等于 regular_price?
- node.js - Fastify 应用在 Cloud Run 上部署时返回 400
- excel - VBA删除工作表名称包含文本的所有工作表中的列
- javascript - 异步/等待后如何记录返回值?