Django模型转字典时,将跳过所有DateTimeField字段。

11

我刚刚注意到一个关于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()跳过它...

2个回答

18

我发现问题出在auto_now_add=True上,它自动将editable设置为False,导致model_to_dict()跳过了这些字段。


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'}

有点奇怪,我的Django安装出了问题?让我贴出我的输出。你用的是哪个版本的Django?我的是1.4.3最终版。 - pinghsien422
Python 2.7.3 (默认, 2012年8月1日, 05:14:39)django.VERSION(1, 4, 5, 'final', 0) - emcpow2
我刚刚将Django升级到1.5.1正式版,但仍然存在相同的问题。我的Python版本与你的相同。 - pinghsien422
所以我不知道。我只能建议您调试“model_to_dict”函数并查看实际发生了什么。 - emcpow2
3
我发现问题的原因是auto_now_add=True,它会自动设置editable=False,这导致model_to_dict()跳过了这些字段。 - pinghsien422
显示剩余3条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接