Django对象不可下标导致我写冗余代码

3 投票
2 回答
5325 浏览
提问于 2025-04-17 10:45

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 个回答

9

为什么不这样做呢:

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

当然,如果你使用的是 contrib.authUser 模型,你需要提供一些必填的字段。

13

你需要的就是setattr这个函数。

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

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

撰写回答