Django Rest框架非模型序列化器

fpg*_*ost 3 python django serialization django-serializer django-rest-framework

假设我有一个像这样的模型

class MyModel(models.Model):
    kwargs = models.TextField()
Run Code Online (Sandbox Code Playgroud)

其中kwargs字段通常是 ​​JSON 字符串,表示关键字参数的字典,例如'{"X": 1, "Y": 2}'. 修改此模型是不切实际的,因为它是属于第 3 方应用程序的模型,并且修改该字段可能需要对代码进行分叉和其他更改。

现在,我使用django-rest-framework提供用于创建/更新/列出/删除 的实例的端点MyModel,并且我有一个序列化器,如下所示:

class MyModelSerializer(serializers.ModelSerializer):
    class Meta:
        model = MyModel
        fields = ('kwargs',)
Run Code Online (Sandbox Code Playgroud)

以促进这一点。这一切都正常,但由于各种原因,用户希望手动输入 kwargs 的 JSON 转储字符串,即手动输入'{"X": 1, "Y": 2}'文本框或传递手动构建的字符串。他们宁愿能够单独将X和传递Y给 API。

如何使用序列化器来实现这一点?换句话说,我如何创建一个具有向用户提供的非模型字段的序列化器,但这些字段在更新/创建时转储/组合成 JSON 字符串,并kwargs相应地映射到模型实例字段。

Ben*_*are 7

如果您不想,则不必将序列化器设为 ModelSerializer (也许您已经意识到这一点,但我知道我一开始并没有),您可以从serializers.Serializer 继承,并包含您想要的字段。就像是

class MyModelSerializer(serializers.Serializer):
    x = serializers.IntegerField()
    y = serializers.IntegerField()
Run Code Online (Sandbox Code Playgroud)

然后,您只需设置视图以使用此序列化器,从中获取数据并在视图中创建/更新模型。