首页 > 解决方案 > 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)

你知道如何让它工作吗?

标签: pythondjangopython-3.xdjango-rest-framework

解决方案


我注意到的第一件事是您在设置显示字段super().__init__ 之前调用,因此父类方法可能会抛出该错误,因为当它检查它们尚不存在的字段时,但您没有发布完整的回溯,您发布的内容不足以让我复制。

最好准确地告诉我们您真正想要什么,因为您为该序列化程序所使用的模式看起来……不好。


推荐阅读