5

在我的单元测试中,实际上,我创建的 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''}}

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

4

1 回答 1

4

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

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

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

如果您查看有关反序列化对象的 DRF 文档,它们会准确显示您需要的示例:

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

我希望这会有所帮助。

于 2013-10-23T10:28:18.743 回答