【发布时间】:2018-05-24 09:59:48
【问题描述】:
我最近在我的序列化程序中添加了一个source='get_fieldname_display。它非常适合获取 choices 元组的显示值,但现在我无法再使用 API 端点发布数据而不会出现错误:
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__')
【问题讨论】:
-
你在models.py中的fieldName是一个有选择的IntegerField?
-
您可以将该特定字段设置为
required=False -
我不认为问题出在模型上,我认为问题出在序列化程序上。基本上,我的目标是将“get_FOO_display”呈现为 JSON——但这样做是通过添加我的问题中提到的代码行——我不能再使用相同的序列化程序发布数据。也许快速修复是使用两个不同的序列化程序?一个用于获取,另一个用于发布?不过我不知道该怎么做。
-
@VijeshVenugopal,我将
required=False添加到序列化器中,但我使用的模型需要该字段才能创建一个新对象——这就是我在发布时所做的。我的错,我应该提前指定。
标签: python django django-rest-framework