Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/308.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python Django Rest框架序列化程序丢失数据_Python_Django_Serialization_Django Rest Framework - Fatal编程技术网

Python Django Rest框架序列化程序丢失数据

Python Django Rest框架序列化程序丢失数据,python,django,serialization,django-rest-framework,Python,Django,Serialization,Django Rest Framework,在我的单元测试中,实际上,我创建的ModelSerializer类似乎丢弃了它所提供的全部数据: class KeyboardSerializer(serializers.ModelSerializer): user = serializers.Field(source='user.username') mappings = KeyMapSerializer(many=True, source='*') class Meta: model = Keybo

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

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

在调用
is valid()
之前,不会填充
数据
键。(这是一种数据安全功能,在确定输入安全之前,它会阻止您访问输入

将调用添加到
is\u valid()
,您应该会看到您的数据

由于您正在进行反序列化,但希望访问
对象
属性以返回
键盘
实例

如果您进行了回顾,它们将准确地显示您需要的示例:

serializer=CommentSerializer(数据=数据)
序列化程序。_是否有效()
#真的
序列化程序.object
# 

我希望这会有所帮助。

您也能发布输出吗?啊哈,我明白了。现在遇到了一些问题,尽管.u valid()为true,但由于M2M创建/编辑失败,我无法获取对象-
ValueError:“需要为字段“keyboard”设置值”在使用这种多对多关系之前。
-我需要在哪里重写以实现M2M objectsAh的保存。嵌套写入。一个棘手的问题。您(目前)的最佳选择是使用HyperlinkedRelatedField的独立端点和平面表示。-如果您需要更多详细信息,浏览DRF标记将为您提供更多信息。(导致实际错误的原因是,在保存关系之前需要关系集的两侧。)嗯……我已经提出了一个解决方案,它通过save_object()工作在父对象的序列化程序上,并在保存父对象后动态创建/更新关系。问题是,我理想情况下希望从
序列化程序中获取数据。数据
,但验证似乎只是从字典中删除嵌套源?这行得通。另一个想法是在视图中进行后期保存…-尝试mak将资源设置为只读,然后查看是否获得所需的输出。(然后,您可能会被推到查看路径上)还可以查看
init_data
属性。除此之外,您只需找到一种工作方式并使用它运行即可-到目前为止,嵌套写入是一项正在进行的工作。(它们非常重要。)验证是否涵盖了
init_data
?验证对嵌套数据有效,但随后会将其从
data
属性中删除。
serializer = CommentSerializer(data=data)
serializer.is_valid()
# True
serializer.object
# <Comment object at 0x10633b2d0>