11

モデル内のすべての DateTimeField をスキップし、辞書に変換しないという model_to_dict のバグに気付きましたが、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() はそれをスキップします...

4

2 に答える 2

17

原因は auto_now_add=True であることがわかりました。自動的に editable=False に設定され、model_to_dict() がフィールドをスキップします

于 2013-07-05T08:23:20.563 に答える
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'}
于 2013-04-18T11:37:00.447 に答える