Django对象是“不可订阅的”导致我编写冗余代码

时间:2012-01-21 05:53:21

标签: python django object models

Django对象不是“可订阅的”,这意味着如果您有user.name,则无法使用user['name']定义它,这意味着您无法使用信息动态加载对象。

info = {'first_name': 'Artur', 'last_name': 'Sapek'}

me = User()
for i in info:
    me[i] = info[i]

调出TypeError: 'User' object is not subscriptable,我发现自己编写了像

这样的代码
info = {'first_name': 'Artur', 'last_name': 'Sapek'}

if 'first_name' in info: me.first_name = info['first_name']
if 'last_name' in info: me.first_name = info['last_name']
so on...

(它也需要if语句,因为有更多的信息并且它并不总是完整的 - 这不是我的实际代码)

有没有更好的方法可以使用Django对象,这些对象没有像列表,字符串和字符串一样使用括号表示法的灵活性?

2 个答案:

答案 0 :(得分:11)

setattr正是您要找的。

在你的情况下,你可以这样做:

for attr, value in info.items():
    setattr(me, attr, value)

答案 1 :(得分:8)

为什么不这样做:

info = {'first_name': 'Artur', 'last_name': 'Sapek'}
user = User(**info)

当然,如果您使用contrib.auth的{​​{1}}模型,则需要提供必填字段。