我最近添加了一个source='get_fieldname_display
到我的序列化器。它在获取choices
元组的显示值时工作得很好,但现在我不能再使用API端点POST数据而不会得到错误:
TypeError: 'get_fieldname_display' is an invalid keyword argument for this function
为了清楚起见,对序列化器的添加是专门的这一行:
fieldName = serializers.CharField(source='fieldName_display')
我知道这一行是导致问题的原因,因为当我注解掉它时,我可以毫无问题地发布数据。但是,我需要这一行,这样当我获取数据时,我就可以从choices
元组中获取显示名称。
我认为如果我使用两个不同的序列化器,一个用于GET,另一个用于POST,这个问题可能会得到解决,但我不确定如何做到这一点--我在views.py中使用的是generics.ListCreateAPIView
。
编辑:
我的模型看起来像这样:
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__')
3条答案
按热度按时间42fyovps1#
要实现这一点,您需要自定义序列化器字段。
下面是Python 3的代码片段:
然后又道:
这是一个有点黑客虽然,所以不是所有的自动文档引擎检测正确的选择,即使这工作得很好。
您可能也喜欢https://github.com/encode/django-rest-framework/issues/1755
qgzx9mmu2#
您可以尝试在以下位置添加新字段:
byqmnocz3#
对于任何人来说,这可能仍然有帮助,我最喜欢的方法是创建一个新的字段来显示人类可读的名称,并使新字段只读。
您的序列化程序现在看起来类似于
你的回答看起来像是
一个字段具有简短、明确的值,非常适合创建和更新操作,另一个字段是只读的,人类可读。