で2つのクエリセットに参加することは、私はすべてのユーザーのための賞の数と、すべてのユーザ(すなわちのために使用され数々の賞含むクエリセットを取得したいと、私は次のモデルにジャンゴ
今class Award(models.Model):
user = models.ForeignKey(User)
class AwardReceived(models.Model):
award = models.ForeignKey(award)
date = models.DateField()
units = models.IntegerField()
class AwardUsed(models.Model):
award = models.ForeignKey(award)
date = models.DateField()
units = models.IntegerField()
を持っていると仮定どちらも)。私は各計算のために1つのクエリを行うことを好む - 私は私のコードでそれを組み合わせたときにいくつかの予期しない結果があった。また、私のクエリのいくつかについては、クエリが複雑すぎるので、1つのクエリを実行することはできません - 私は8つのフィールドを計算しています。これはこれまで私がそれを解決した方法です:
def get_summary(query_date)
summary = (Award.objects.filter(awardreceived__date__lte=query_date))
.annotate(awarded=Sum('awardissuedactivity__units_awarded')))
awards_used = (Award.objects.filter(awardused__date__lte=query_date)
.annotate(used=Sum('awardused__date__lte__units')))
award_used_dict = {}
for award in awards_used:
award_used_dict[award] = award.used
for award in summary:
award.used = award_used_dict.get(award, 0)
return summary
辞書アプローチなしでこれを解決する方法が必要でしょうか?たとえば、次のようなものがあります:awards_used.get(award=award)
しかし、これはループごとにdbルックアップを引き起こします。
また、他のいくつかのファンシーな方法でクエリセットに参加できますか?
これは単純な例であり、この例ではDB構造を改善することができますが、私は自分の質問を説明しようとしています。
あなたの試験では、「exercised_awards_dict」とは何ですか? –
申し訳ありませんが、コードからコピーしましたが、すべての変数名が変更されていませんでした。今すぐ固定 – Johan