【问题标题】:Django rest framework non-model serializerDjango rest 框架非模型序列化器
【发布时间】:2016-04-07 14:19:03
【问题描述】:

假设我有一个类似的模型

class MyModel(models.Model):
    kwargs = models.TextField()

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

现在,我正在使用 django-rest-framework 提供和端点来创建/更新/列出/删除 MyModel 的实例,并且我有一个类似的序列化程序:

class MyModelSerializer(serializers.ModelSerializer):
    class Meta:
        model = MyModel
        fields = ('kwargs',)

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

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

【问题讨论】:

  • 我很困惑。您只有一个字段,恰好是一个文本字段,但您想使用序列化程序根据用户输入构建您的 json?
  • 被序列化的模型有一个字段(至少在这个最小的例子中),但我希望序列化有多个字段,例如X, Y 的输入被组合成一个表示 JSON 字典的字符串,然后作为文本存储在模型实例的 kwargs 字段中。
  • 您可以创建一个包含所有字段的序列化程序,运行 serializer.is_valid() 并使用 json.dumps() 将经过验证的数据转换为 json。

标签: python django django-rest-framework serialization django-serializer


【解决方案1】:

如果你不想让你的序列化器成为 ModelSerializer(也许你已经意识到这一点,但我知道我一开始并没有),你可以从 serializers.Serializer 继承,使用你想要的字段。类似的东西

class MyModelSerializer(serializers.Serializer):
    x = serializers.IntegerField()
    y = serializers.IntegerField()

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

【讨论】:

    猜你喜欢
    • 2012-11-16
    • 2013-03-31
    • 2017-11-15
    • 2014-07-26
    • 2018-06-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-08-01
    相关资源
    最近更新 更多