在django中,我构建了一个被调用的简单方法,并传递了唯一的字段说明符和值。然后,它会添加一个简单的内容来更新字段中的值。我已经通过多种方式对其进行了编码,并得出结论:getattr在尝试保存,更新或刷新数据库时不起作用。 我的代码的一个变体:
def updatetable(uid, fieldtitle, value):
workingobj = bog_db.objects.get(name=uid)
objectcall = getattr(workingobj,fieldtitle)
objectcall = F(fieldtitle) + value
workingobj.refresh_from_db()
return
我试着用手干扰一些代码,看看能不能找出问题所在。 顺便说一句:价值= 37
In [36]: call = getattr(workingobj,fieldname)
In [37]: call
Out[37]: 37
In [38]: call += value
In [39]: call
Out[39]: 74
In [40]: workingobj.save()
#refreshed database, checked table, values in db not updated
In [41]: workingobj.total_number_posts += value
In [42]: workingobj.total_number_posts
Out[42]: 74
In [43]: workingobj.save()
#refreshed database, values in db were updated
在我看来,Django不希望你使用getattr进行db调用和更新,而是希望你明显地调用object.field。
这是真的吗? getattr是否制作了属性的副本?我想更好地理解它为什么会这样做。
由于
答案 0 :(得分:0)
我不确定你在这里期待什么,但这与Django没有任何关系,与setattr
无关。
整数是不可变的。但是,您获得fieldname的值并将其存储在call
中,您无法修改它。执行call += value
会创建一个新值并将其存储在call
中;现在与fieldname的原始值没有关系。
请注意,如果您最初call = workingobj.fieldname
,则完全会得到相同的结果。