Django-Rest框架:在序列化程序中获取并显示不允许我发布

2024-09-28 22:19:30 发布

您现在位置:Python中文网/ 问答频道 /正文

我最近向序列化程序添加了一个source='get_fieldname_display。为了获得choices元组的显示值,它工作得很好,但是现在我不能再使用API端点来发布数据,而不会出现错误:

TypeError: 'get_fieldname_display' is an invalid keyword argument for this function

明确地说,对序列化程序的添加是以下这一行:

^{pr2}$

我知道这行代码导致了问题,因为当我注释掉它时,我可以毫无问题地发布数据。但是,我需要这一行,这样我就可以在获取数据时从choices元组中获取显示名称。在

我认为如果我使用两个不同的序列化程序,一个用于GET,另一个用于POST,那么这个问题可能会得到解决,但是我不确定如何执行此操作—我在我的视图.py. 在

编辑:

我的模型是这样的:

class MakeObjects(models.Model):

    FIELD_NAME_CHOICES = (
        ("01", "Choice 1"), 
        ("02", "Choice 2"), 
    )

    fieldname = CharField(choices = FIELD_NAME_CHOICES)

此序列化程序看起来像:

class ObjectSerializer(serializers.ModelSerializer): 
       fieldname = serializers.CharField(source='get_fieldname_display')
       class Meta:
           model = MakeObjects
           fields = ('__all__')

Tags: 数据name程序fieldsourceget序列化display
2条回答

为此,您需要自定义序列化程序字段。在

以下是python 3的片段:

class DisplayNameWritableField(serializers.ChoiceField):
    def __init__(self, **kwargs):
        self.html_cutoff = kwargs.pop('html_cutoff', self.html_cutoff)
        self.html_cutoff_text = kwargs.pop('html_cutoff_text', self.html_cutoff_text)

        self.allow_blank = kwargs.pop('allow_blank', False)
        super(ChoiceField, self).__init__(**kwargs)

    def to_representation(self, value):
        return self.choices.get(value, value)

    def bind(self, field_name, parent):
        super().bind(field_name, parent)
        self.choices = parent.Meta.model._meta.get_field(field_name).choices

然后:

^{pr2}$

不过,这有点老套,所以并不是所有的auto-docs引擎都能正确地检测到选择,尽管这很好用。在

您可能还喜欢https://github.com/encode/django-rest-framework/issues/1755

您可以尝试在以下位置添加新字段:

read_only_fields = ['fieldName']

相关问题 更多 >