是否可以在django rest框架中重命名字段

时间:2013-12-12 21:15:14

标签: django-rest-framework

我的python代码有一个名为field_name的字段,对于python来说很好,并且与Django配合得很好。

许多Javascript linters希望你让它成为fieldName,或者他们会对你抱怨很多。

试图在两者之间找到一个很好的共同点,我写了像

这样的序列化器
class MySerializer(serializers.ModelSerializer):
    fieldName = serializers.WritableField(source='field_name', required=True)
    class Meta:
        model = Widget
        exclude = ('field_name',)

问题是这不会用fieldName替换field_name的外部表示,它同时发送fieldName和field_name。所以我告诉它排除('field_name')。然后,当您尝试保存时,它会变得非常沮丧,因为field_name不存在,或者fieldName不是该对象的成员。

我原以为映射是一种很好的方法,但事实并非如此。有没有办法从python映射名称 - > javascript所以代码在两端都看起来很漂亮?

2 个答案:

答案 0 :(得分:3)

找到一个在json级别处理它的包:

https://pypi.python.org/pypi/djangorestframework-camel-case/0.1.0

文档非常稀疏,但它似乎有效,并且集成它很简单(这可能解释了稀疏的文档)。

答案 1 :(得分:2)

您的代码应该正常工作。所以示例中缺少一些东西

想到的是你的fields值 - 你在那里指定了什么?通常最好明确指定你想要的字段,而不是使用exclude - 设置(可能)需要更长的时间,但从长远来看,这将节省时间。

如果fieldName中包含fieldsfield_name不包含fieldName,我希望您的代码能够正常运行。

(如果不能解决它,可能会显示更多。)

修改后更新

确定。是。您应该指定所需的字段。您的field_name充当额外字段,其来源为{{1}} - 例如,当使用SerializerMethodField时,这种情况非常有用。

更新:额外解决方案

有一个ticket asking about Camel-casing field names for better compatibility with e.g. JavaScript clients。这链接到Gist with a working solution via custom renderer and parser classes