2

私は次のようなことをしたい:

people = People.objects.filter(date=date)
person = people[0]
person['salary'] = 45000

最後の行でエラーが発生します。

object does not support item assignment

このようなものをデバッグするには、何かが機能するところから始めて、何かが壊れるまで行ごとに変更する方が簡単だといつも思います。

テンプレートでレンダリングするオブジェクトを変更したいと考えています。私が試してみると:

person.salary = 45000

エラーはありませんが、試してみてください

print person.salary

その直後に、元の値が出力されます。アップデート:

私のコードでは、実際に行っていました:

people[0].salary = 45000

これは機能しません。何らかの理由で

person = people[0]
person.salary = 45000

動作します。2つのコードはまったく同じだと思いました

4

3 に答える 3

5

personはオブジェクトです。次のようにする必要があります。

person.salary = 45000
person.save()

How to work with models を読んでください。

于 2013-05-21T05:39:20.200 に答える
0

Django モデルが提供するオブジェクト リレーショナル マッピングは、データを取得および操作するためのオブジェクト指向のインターフェイスを提供することで、DB とやり取りしているという事実を隠します。

残念ながら、ORM の抽象化は完全ではなく、ORM のセマンティックが直感と一致しない場合がさまざまあります。このような場合、問題の原因を突き止めるために、基盤となる SQL レイヤーで何が起こっているかを調査する必要があります。

あなたの問題は、次の事実から生じます。

people = People.objects.filter(date=date)

SQL クエリを実行しません。

people[0]

SELECT a, b, c, .. FROM T WHERE filter次を呼び出して結果のオブジェクトを変更すると、 が実行されます。

people[0].salary = 45000

save()メソッドが呼び出されなかったため、変更は DB に保存されません。次回のpeople[0]again の呼び出しで SQL クエリが実行されますが、保存されていない変更は返されません。

このような問題が発生した場合、Django デバッグ ツールバーは、どのステートメントがどの SQL クエリを実行するかを識別するのに非常に役立ちます。

于 2013-05-21T07:54:32.250 に答える