【问题标题】:Django rest framework: De serializing a string to an integer and vice versaDjango rest框架:将字符串反序列化为整数,反之亦然
【发布时间】:2018-05-15 05:29:06
【问题描述】:

我们正在使用 Django Rest 框架来序列化和反序列化来自第三方 API 的 json 响应。我需要在我们的系统中将字符串字段值转换为数值。

JSON 响应如下所示

{
   "result": "win" # Other values include "loss"/"inconclusive"/"pending"
}

Django 模型

class Experiment(Model):
   RESULTS = (
       (1, 'win'),
       (2, 'loss'),
       (3, 'inconclusive'),
   )
   inferred_result = models.IntegerField(choices=RESULTS, null=True, blank=True)

Django 序列化器类

class ResultsSeializer(serializers.ModelSerializer):
    # Need to convert "result" from "string" to "int" and vice versa.

    class Meta:
        model = models.Experiment

我想将 inferred_result 整数值转换为 string 等效值,反之亦然。我可以使用这种方法:Django rest framework. Deserialize json fields to different fields on the model 如果这是将整数转换为字符串的好主意。如何将字符串转换为 int?我是 django rest api 和 django 的新手。

【问题讨论】:

    标签: python django serialization django-rest-framework


    【解决方案1】:

    要显示字符串而不是 int,您可以使用 get_FOO_display 模型的属性。要在创建过程中将字符串转换为 int,您可以像这样覆盖 create() 方法:

    class ResultsSeializer(serializers.ModelSerializer):
        inferred_result = serializers.CharField(source='get_inferred_result_display')
    
        class Meta:
            model = models.Experiment
            fields = ('inferred_result',) 
    
        def create(self, validated_data):
            dispplayed = validated_data.pop('get_inferred_result_display')
            back_dict = {k:v for v, k in models.Experiment.RESULTS}
            res = back_dict[dispplayed]
            validated_data.update({'inferred_result': res})
            return super(ResultsSeializer, self).create(validated_data)
    

    如果需要,您需要以同样的方式覆盖 update()

    【讨论】:

    • 如何将 json 响应中的“结果”翻译为“inferred_result”字段。我不明白您所说的“get_result_display”是什么意思。
    • @Kartik 你读过链接get_FOO_display的文档吗?
    • @BearBrown 我做了,但“源”用于填充该字段,而不用于从中读取。 django-rest-framework.org/api-guide/fields/#source。 “get_Foo_display”用于从模型中提供用户友好的值,但它不知道它是否是可序列化的。 db 列也接受空值。如何将 null 转换为用户友好的字符串。我不想将“无”显示为输出。
    • @neverwalkaloner “get_new_int_display”是什么意思?我假设您输入“new_int”时的意思是“inferred_result”? “get_result_display”是否映射到 django 模型中的方法?
    • @Kartik 哦,实际上应该是get_inferred_result_display。我认为您的字段名为result。是的 get_inferred_result_display 是模型的方法,它将 int 转换为名为 inferred_result 的选择字段的人类可读字符串
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-05-27
    • 2021-05-10
    • 1970-01-01
    • 1970-01-01
    • 2012-05-01
    • 1970-01-01
    相关资源
    最近更新 更多