【问题标题】:Django Rest Framework serializer losing dataDjango Rest Framework 序列化程序丢失数据
【发布时间】:2013-10-23 10:22:55
【问题描述】:

在我的单元测试中,实际上,我创建的 ModelSerializer 类似乎丢弃了它提供的全部数据:

class KeyboardSerializer(serializers.ModelSerializer):
    user = serializers.Field(source='user.username')
    mappings = KeyMapSerializer(many=True, source='*')

    class Meta:
        model = Keyboard
        fields = ('user', 'label', 'is_primary', 'created', 'last_modified', 'mappings')

    def pre_save(self, obj):
        obj.user = self.request.user

TEST_KEYBOARD_MAP = {
                        'user': None,
                        'label': 'New',
                        'is_primary': True,
                        'created': '2013-10-22T12:15:05.118Z',
                        'last_modified': '2013-10-22T12:15:05.118Z',
                        'mappings': [
                            {'cellid': 1, 'key': 'q'},
                            {'cellid': 2, 'key': 'w'},
                        ]
}

class SerializerTests(TestCase):

    def setUp(self):
        self.data = TEST_KEYBOARD_MAP

    def test_create(self):
        serializer = KeyboardSerializer(data=self.data)
        print serializer.data

输出:

{'user': u'', 'label': u'', 'is_primary': False, 'created': None, 'last_modified': None, 'mappings': {'id': u'', 'cellid': None, 'key': u''}}

数据中传递给序列化程序的所有信息发生了什么变化?

【问题讨论】:

  • 你也可以发布输出吗?

标签: python django serialization django-rest-framework


【解决方案1】:

在您调用 is_valid() 之前,不会填充 data 键。 (这是一项数据清理安全功能,可在您确定输入安全之前阻止您访问输入。

将调用添加到is_valid(),您应该会看到您的数据。

由于您正在反序列化,但您希望访问 object 属性以返回您的 Keyboard 实例。

如果您查看the DRF docs on deserializing objects,他们会准确显示您需要的示例:

serializer = CommentSerializer(data=data)
serializer.is_valid()
# True
serializer.object
# <Comment object at 0x10633b2d0>

希望对你有帮助。

【讨论】:

  • 啊哈,我明白了。现在遇到的问题是,尽管 .is_valid() 为真,但由于 M2M 创建/编辑失败,我无法获取对象 - ValueError: "&lt;Keyboard: Keyboard for test5&gt;" needs to have a value for field "keyboard" before this many-to-many relationship can be used. - 我需要在哪里覆盖以实现 M2M 对象的保存
  • 啊。嵌套写入。一个棘手的。您最好的选择(当前)是单独的端点和使用 HyperlinkedRelatedField 的平面表示。 django-rest-framework.org/api-guide/relations.html — 如果您需要更多详细信息,浏览 DRF 标签将为您提供更多信息。 (实际报错是因为在保存关系之前需要关系集的两边。)
  • 嗯 ...我已经制定了一个解决方案,它通过父对象的序列化程序上的 save_object() 工作,并在保存父对象后即时创建/更新关系。这个问题是我理想地想从serializer.data 中获取数据,但似乎验证只是从字典中删除了嵌套的源?
  • 那行得通。另一个想法是在视图中执行 post_save... — 尝试将资源设为只读,然后查看是否获得所需的输出。 (然后您可能会被推向查看路线)另外请查看init_data 属性。除此之外,您只需要找到一种可行的方法并与之一起运行——嵌套写入目前正在进行中。 (它们很重要。)
  • 验证是否涵盖init_data?验证适用于嵌套数据,但随后似乎将其从 data 属性中删除。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-12-18
  • 2017-06-04
  • 2018-06-04
  • 1970-01-01
  • 1970-01-01
  • 2014-08-17
  • 2020-05-23
相关资源
最近更新 更多