2016-09-15 5 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 

私は問題を把握できたかどうかを確認するためにいくつかのコードを妨害手を試してみました。 ところで:代わりに、Djangoはあなたがデシベルコールと更新を行うためのgetattrを使用したくないように私には見えるとなり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 

値は=あなたが明示的にobject.field呼び出すしたいと考えています。

これは本当ですか? getattrは属性のコピーを作成しますか?私はなぜそれがこのように行動しているのかをよりよく理解したい。

おかげ

答えて

0

は、私はあなたがここに期待しているかわからないんだけど、これはDjangoが何を望むとは何の関係もあり、setattrとは何の関係もありません。

整数は不変です。しかし、フィールド名の値を取得し、それをcallに格納すると、それを変更することはできません。 call += valueを実行すると、新しい値が作成され、callに格納されます。 fieldnameの元の値とは関係がありません。

が正確にになるのは、もともとcall = workingobj.fieldnameでした。

+0

私は、簡単な更新メソッドを書くことができ、フィールドを渡して簡単な数学を行うことができる方法としてgetattrを使用しようとしていました。私はその後、フィールドを明示的に参照する2つの異なるメソッドを使用するためにコードを微調整しました。私はgetattrが実際に属性にアクセスし、そのコピーを作成しないと考えていました。私は今あなたがコードをよく見ていることを意味しています。ありがとう。 –

+0

最終的に私は問題の一部が私がproject.modelsインポートモデルから抜けていたことを知りました。モデルオブジェクトを変数として渡すことができました。次に、変数を更新できるように、getattrとsetattrの組み合わせを思いつきました。 –

関連する問題