是否可以使用括号引用Django中的字段



你好,我想看看是否有能力使用括号引用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()表达式是否与要更新的正确对象匹配即可

相关内容

  • 没有找到相关文章

最新更新