2012-05-03 13 views
5

に行われた変更後、私は私が(変更を加えビュー、そのビューには再Djangoのクエリを評価データベース

contributions = user_profile.contributions_chosen.all()\ 
    .filter(payed=False).filter(belongs_to=concert)\ 
    .filter(contribution_def__left__gt=0)\ 
    .filter(contribution_def__type_of='ticket') 
私は私のテンプレートで使用

context['contributions'] = contributions 

以降にこの長いクエリセット声明を得ましたレコードを追加または削除する)をcontributions_chosenテーブルに追加し、私のコンテキスト[contributions]を更新したいのであれば、同じlenghtyクエリでデータベースを再クエリする必要があります。

contributions = user_profile.contributions_chosen.all()\ 
.filter(payed=False).filter(belongs_to=concert)\ 
.filter(contribution_def__left__gt=0)\ 
.filter(contribution_def__type_of='ticket') 

そして、再び、私はそれが実際にデータベース上の実際のデータを反映したような貢献を再評価するために、私の自己の繰り返しを避けることができます任意の方法をtheresの場合

context['contributions'] = contributions 

は、だから私は思っていた私のコンテキストを更新します。 理想的には、クエリーセットのコントリビューションを変更し、その値が更新されると同時に、データベースにこの変更が反映されますが、これを行う方法はわかりません。 UPDATE

: これは私が2つの コンテキストの間で何をすべきか[ '貢献'] =拠出

私はcontributions_chosen(これはM2Mの関係である)に、新たな貢献オブジェクトを追加し、ある

contribution = Contribution.objects.create(kwarg=something,kwarg2=somethingelse) 
user_profile.contributions_chosen.add(contribution) 
contribution.save() 
user_profile.save() 

場合によってはiが寄与オブジェクト 寄与= user_profile.contributions_chosen.get(ID = 1) user_profile.contributions_chosen.get(ID = request.POST [ 'CON contribution.deleteを削除()

ご覧のとおり、contributions_chosenテーブルを変更しているので、クエリを再発行してコンテキストを更新する必要があります。 何が間違っていますか?

UPDATE 評価についてのコメントを見た後、私は[「貢献」]私はコンテキスト間 LEN(寄付)を行うクエリセットをevalしません実現し、それが問題のようです。 私はデータベースの操作の後にそれを移動し、それはthats、ありがとう男です。

+0

あなたは、クエリセット 'contributions'を評価されていないので、それはまだDBからないフェッチされたデータを持っているので、それを更新することを心配する必要はありませんようです。 'QuerySet'は遅延評価されるので、評価されるまでDB行に関係するものは何もありません。 – okm

答えて

2

クエリの再評価を避ける方法がわかりませんが、コードに繰り返しのステートメントを保存する方法の1つは、すべてのフィルタで辞書を作成し、filter引数をdictとして指定することです。

query_args = dict(
    payed=False, 
    belongs_to=concert, 
    contribution_def__left__gt=0, 
    contribution_def__type_of='ticket', 
) 

、その後

contributions = user_profile.contributions_chosen.filter(**query_args) 

これは単にいくつかの繰り返しのコードを削除しますが、繰り返しのクエリを解決していません。あなただけの通常のPython辞書としてquery_argsを扱う、引数を変更する必要がある場合、それはすべて:)

+1

コードでは、彼は提供しても、とにかく質問を評価していないようです。クエリは、テンプレート内で繰り返し処理されるとき、またはクエリ評価をトリガする他の処理を行うときに評価されます(https://docs.djangoproject.com/ja/dev/ref/models/querysets/#when-querysetsで文書化されています)。 - 評価された –

3

更新 後の1であるので、心配する必要はありません、あなたはクエリセットcontributionsを評価されていないようですまだDBからデータをフェッチしていないため、更新します。

2つのcontext['contributions'] = contributions行の間にコードをポストできますか?通常、クエリーセットcontributionsを評価する前に(例えば、反復処理や__len__()を呼び出すなど)、DBからの読み込みは何も含まれていないため、更新の内容は必要ありません。

は、クエリセットを再評価するために、あなたの可能性

# make a clone 
contribution._clone() 
# or any op that makes clone, for example 
contribution.filter() 

# or clear its cache 
contribution._result_cache = None 

# you could even directly add new item to contribution._result_cache, 
# but its could cause unexpected behavior w/o carefulness 
+1

また 'contribution.all()' –

+0

ドキュメントは、特に['all()'](https://docs.djangoproject.com/en/1.11/ref/models/querysets/#all)この目的のために。 –

関連する問題