6

ビューでこの長いクエリセットステートメントを取得しました

    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'] を更新したい場合は、同じ長さのクエリでデータベースを再クエリする必要があります。

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

したがって、データベース上の実際のデータを実際に反映するように、貢献を再評価するために、自分自身を繰り返さないようにする方法があるかどうか疑問に思っていました。理想的には、クエリセットのコントリビューションを変更し、その値を更新し、同時にデータベースにこの変更を反映させますが、これを行う方法がわかりません。

更新:これは、2つのコンテキスト['貢献'] =貢献の間で私が行うことです

私は、contributions_chosen に新しい貢献オブジェクトを追加します (これは m2m リレーションです)。

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

そして、場合によっては、投稿オブジェクトを削除します。

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

UPDATE評価についてのあなたのコメントを見た後、私はクエリセットをevalすることに気づきました。データベース操作の後に移動するだけです。ありがとうございます。

4

2 に答える 2

4

update querysetcontributionsを評価していないようです。したがって、まだ DB からデータをフェッチしていないため、更新について心配する必要はありません。

context['contributions'] = contributions2行の間にコードを投稿できますか? 通常、クエリセットを評価する前に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
于 2012-05-03T15:25:28.050 に答える
2

クエリの再評価を回避する方法はわかりませんが、コード内で繰り返されるステートメントを保存する 1 つの方法は、これらすべてのフィルターを使用して dict を作成し、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)

これにより、繰り返されるコードが削除されるだけで、繰り返されるクエリは解決されません。引数を変更する必要がある場合はquery_args、通常の Python dict として処理してください。結局のところ、それは 1 つです :)

于 2012-05-03T15:21:20.827 に答える