我刚注意到model_to_dict的一个错误,它跳过了模型中的所有DateTimeField,并且从不将它们转换为字典,而使用QuerySet的values()函数却没有。我在互联网上查看,但找不到其他人有同样的问题。我只是想确认这确实是其他人遇到的问题,看看人们如何解决它。在这种情况下,每个人都避免使用model_to_dict并尝试使用values()来模拟行为吗?或者有更好的解决方案吗?你有什么想法?
谢谢!
以下是out:
>>> member = Member.objects.get(id=1)
>>> member.create_time
datetime.datetime(2013, 2, 26, 6, 1, 2, tzinfo=<UTC>)
>>> model_to_dict(member)
{'verified': True, 'name': u'John', 'email': u'', 'phone': u'', 'id': 1L, 'password': u'4e3fc0574fbcdff16c8508339e', 'verify_token': u'5d98aacaba39eb7e'}
正如您所见,'create_time'字段不在字典中。我不得不手动插入它:
>>> obj = model_to_dict(member)
>>> obj
{'verified': True, 'name': u'John', 'email': u'', 'phone': u'', 'id': 1L, 'password': u'4e3fc0574fbcdff16c8508339e', 'verify_token': u'5d98aacaba39eb7e'}
>>> obj["create_time"] = member.create_time
>>> obj
{'verified': True, 'name': u'John', 'email': u'', 'phone': u'', 'create_time': datetime.datetime(2013, 2, 26, 6, 1, 2, tzinfo=<UTC>), 'id': 1L, 'password': u'4e3fc0574fbcdff16c8508339e', 'verify_token': u'5d98aacaba39eb7e'}
>>>
编辑:
我想我发现了问题:在model_to_dict()中:
opts = instance._meta
for f in opts.fields:
if not f.editable:
continue
我的create_time字段显示为不可编辑。进一步的研究表明,auto_now_add = True会自动使editable = False。因此导致model_to_dict()跳过它......
答案 0 :(得分:11)
我发现原因是auto_now_add = True,它会自动设置editable = False,这会导致model_to_dict()跳过字段
答案 1 :(得分:0)
我无法复制您的问题
>>> pprint(model_to_dict(User.objects.get(pk=1)))
{'date_joined': datetime.datetime(2013, 1, 21, 10, 56, 6, tzinfo=<UTC>),
'email': u'g@o.org',
'first_name': u'\u042d\u0434\u0443\u0430\u0440\u0434',
'groups': [],
'id': 1,
'is_active': True,
'is_staff': True,
'is_superuser': True,
'last_login': datetime.datetime(2013, 3, 26, 12, 10, 28, 834151, tzinfo=<UTC>),
'last_name': u'\u0418\u0441\u043a\u0430\u043d\u0434\u0430\u0440\u043e\u0432',
'password': u'pbkdf2_sha256$10000$n8t2YQB1MaZE$lVg5bbp22ixDNQCj7AjtzGJ3WzOUnJo24137fTOxwi4=',
'user_permissions': [],
'username': u'1'}