我刚刚注意到一个关于model_to_dict的错误,它会跳过模型中的所有DateTimeField,并且从不将它们转换为字典,而使用QuerySet的values()函数则不会。我在网上查找,但找不到其他人遇到同样的问题。我只想确认这确实是其他人也遇到的问题,并看看人们如何解决它。每个人都只是避免在这种情况下使用model_to_dict,并尝试使用values()来模拟其行为吗?还是有更好的解决方案?你有什么想法?
谢谢!
以下是输出:
>>> 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()跳过它...