【问题标题】:Django model_to_dict skips all DateTimeField when converting modelsDjango model_to_dict 转换模型时跳过所有 DateTimeField
【发布时间】:2013-04-11 10:37:16
【问题描述】:

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

【问题讨论】:

    标签: django datetime model


    【解决方案1】:

    我无法复制您的问题

    >>> 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 最终版
    • Python 2.7.3 (default, Aug 1 2012, 05:14:39) django.VERSION (1, 4, 5, 'final', 0)
    • 让我尝试升级 django 看看是否能解决问题
    • 您的示例中的 create_time 是否是模型字段而不是属性或属性?
    • 我发现原因是auto_now_add=True,它自动设置editable=False,导致model_to_dict()跳过字段。
    【解决方案2】:

    我发现原因是auto_now_add=True,它自动设置editable=False,导致model_to_dict()跳过字段

    【讨论】:

      猜你喜欢
      • 2017-04-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-04-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-08-02
      相关资源
      最近更新 更多