从具有不同名称的数据值设置序列化器字段(ModelSerizer的自定义字段映射)

3
我有一个Request模型,并且遵循以下要求。
class TruRouteRequest(models.Model):
    msisdn = models.CharField('Subscriber international MSISDN ', max_length=25)
    sessionid = models.CharField(max_length=100, unique=True)
    msg_type = models.CharField(max_length=255)
    msg = models.CharField(max_length=255)

我没能把模型字段的名称写成'type',所以我写成了'msg_type'。我有一个上述模型的ModelSerializer。 我接收到的数据有一个必需的字段'type'。当调用is_valid时,如何将序列化器数据中的type映射为msg_type以避免出现错误?

>> serializer = TruRouteRequestSerializer(data=request.data)
>> serializer.data 
>> {'msisdn': 'M', 'sessionid': 'S', 'msg': 'MSG'}
>> request.data
>> {'msisdn': 'M', 'type': 'T', 'sessionid': 'S', 'msg': 'MSG'} # there is type
>> serializer.is_valid()
>> False
>> serializer.errors
>> {'msg_type': [ErrorDetail(string='This field is required.', code='required')]}
1个回答

3
你可以在序列化器内明确定义type字段,并使用source参数将其映射到msg_type字段:
class TruRouteRequestSerializer(serializers.ModelSerializer):
    type = serializers.CharField(source='msg_type')

    class Meta:
        model = TruRouteRequest
        fields = ['type', ...]

建议使用Python关键字作为字段名吗? - Emmanuel Mtali
@EmmanuelMtali,你是指type变量名吗?这不被推荐,因为你在类中覆盖了内置函数。但是,既然你的代码中没有使用内置的type函数,那就没问题了。 - neverwalkaloner

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接