django getattr 和更新问题
django getattr and issues with updating
在 django 中,我构建了一个简单的方法,该方法被调用并传递一个 uniqueid、字段说明符和一个值。然后它会做一个简单的加法来更新字段中的值。我用多种方法对其进行了编码,得出的结论是 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 进行数据库调用和更新,而是希望您明确调用 object.field.
这是真的吗? getattr 是否复制属性?我想更好地理解为什么它会这样。
谢谢
我不确定你在这里期待什么,但这与 Django 想要任何东西无关,也与 setattr
.
无关
整数是不可变的。但是你获取了fieldname的值并存储在call
中,你不能修改它。执行 call += value
创建一个新值并将其存储在 call
中;现在与 fieldname 的原始值没有关系。
请注意,如果您最初 call = workingobj.fieldname
。
,您会得到 完全相同的结果
在 django 中,我构建了一个简单的方法,该方法被调用并传递一个 uniqueid、字段说明符和一个值。然后它会做一个简单的加法来更新字段中的值。我用多种方法对其进行了编码,得出的结论是 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 进行数据库调用和更新,而是希望您明确调用 object.field.
这是真的吗? getattr 是否复制属性?我想更好地理解为什么它会这样。
谢谢
我不确定你在这里期待什么,但这与 Django 想要任何东西无关,也与 setattr
.
整数是不可变的。但是你获取了fieldname的值并存储在call
中,你不能修改它。执行 call += value
创建一个新值并将其存储在 call
中;现在与 fieldname 的原始值没有关系。
请注意,如果您最初 call = workingobj.fieldname
。