2016-09-15 82 views
1

在django中,我構建了一個簡單的方法,它被調用並傳遞一個uniqueid,字段說明符和一個值。然後它會做一個簡單的添加來更新該字段中的值。我已經通過多種方式對其進行了編碼,並得出結論:在嘗試保存,更新或刷新數據庫時,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 

我試圖用手卡住了一些代碼,看看我是否能找出問題。 BTW:值= 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 

這樣看來,我認爲您使用GETATTR做數據庫調用和更新Django不想要,而是要你顯式調用object.field。

這是真的嗎? getattr是否製作屬性的副本?我想更好地理解爲什麼這樣做。

感謝

回答

0

我不知道你期待什麼在這裏,但這是無關的Django想要什麼,並沒有任何關係setattr

整數是不可變的。但是,您獲取fieldname的值並將其存儲在call中,則無法對其進行修改。做call += value創建一個新值並將其存儲在call;現在與fieldname的原始值沒有關係。

請注意,如果您最初做了call = workingobj.fieldname,您會得到,確切地說的結果相同。

+0

我試圖使用getattr作爲一種方式來寫一個簡單的更新方法,我可以調用並傳遞字段,並讓它做簡單的數學運算。我已經調整了代碼,只是使用了兩個不同的方法,並且明確引用了這些字段。我在想getattr會實際訪問該屬性,而不是複製它。我明白你的意思,我現在更好地看看代碼。謝謝。 –

+0

最終,我終於搞清楚我的問題的一部分是我從project.models導入模型中缺少的。這幫助我將模型對象作爲變量傳遞。然後我想出了getattr和setattr的組合,以便能夠更新變量。 –