你好,我想看看是否有能力使用括号引用Django中的模型
//model
class User(model.Model):
firstname = models.charField()
//referencing
user = User.objects.get(id=1)
//original reference
user.firstname = "John"
// proposed reference
user["firstname"] = "John"
这有可能吗?或者对建议的参考有任何替代方案吗
您可以在模型中实现__getitem__
和__setitem__
,然后调用getattr(..)
和setattr(..)
。例如,您可以在Model
类中对其进行monkey补丁:
from django.db.models import Model
Model.__getitem__ = lambda x, y: getattr(x, y)
Model.__setitem__ = lambda x, y, v: setattr(x, y, v)
但通常情况下,有两种方法来完成某件事不是一个好主意。正如Python的Zen:中所指定的那样
应该有一种——最好只有一种——显而易见的方法来做到这一点。
如果你想根据包含名称的字符串更改属性,你可以用来实现
setattr(user, 'firstname', 'John')
如果目标是基于键/值对的字典更新对象,则不需要下标表示法:
- 使用
setattr
:
将属性setattr(user, key, value)
key
设置为value
,因此如果key = 'firstname'
,则与user.firstname = value
相同 - 或者直接在数据库中更新对象。假设您的键/值对词典与要更新的字段匹配:
将直接保存对象。例如,如果User.objects.filter(id=1).update(**kwargs)
kwargs
是{'firstname': 'John'}
,它只会更新名字。只要注意filter()
表达式是否与要更新的正确对象匹配即可