django getattr和更新问题

时间:2016-09-15 19:01:22

标签: python django django-models getattr

在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是否制作了属性的副本?我想更好地理解它为什么会这样做。

由于

1 个答案:

答案 0 :(得分:0)

我不确定你在这里期待什么,但这与Django没有任何关系,与setattr无关。

整数是不可变的。但是,您获得fieldname的值并将其存储在call中,您无法修改它。执行call += value会创建一个新值并将其存储在call中;现在与fieldname的原始值没有关系。

请注意,如果您最初call = workingobj.fieldname,则完全会得到相同的结果。