私は Django ORM の新しい集約機能をいじっていましたが、可能だと思われるクラスの問題がありますが、それを機能させることができないようです。生成しようとしているクエリのタイプについては、こちらで説明しています。
だから、私は次のモデルを持っているとしましょう -
class ContactGroup(models.Model):
.... whatever ....
class Contact(models.Model):
group = models.ForeignKey(ContactGroup)
name = models.CharField(max_length=20)
email = models.EmailField()
...
class Record(models.Model):
contact = models.ForeignKey(Contact)
group = models.ForeignKey(ContactGroup)
record_date = models.DateTimeField(default=datetime.datetime.now)
... name, email, and other fields that are in Contact ...
そのため、連絡先が作成または変更されるたびに、その時点で連絡先に表示されている情報をタイムスタンプと共に保存する新しいレコードが作成されます。ここで、たとえば、ContactGroup に関連付けられたすべての Contact の最新の Record インスタンスを返すクエリが必要です。擬似コード:
group = ContactGroup.objects.get(...)
records_i_want = group.record_set.most_recent_record_for_every_contact()
filter(record_date__lt=some_date)
これを理解したら、クエリセットに をスローして、 に存在する情報を取得できるようにしたいだけですsome_date
。
誰にもアイデアはありますか?
編集:私は本当に自分自身を明確にしていないようです. このようなモデルを使用して、純粋な django ORM (extra() なし) で次のことを行う方法が必要です。
ContactGroup.record_set.extra(where=["history_date = (select max(history_date) from app_record r where r.id=app_record.id and r.history_date <= '2009-07-18')"])
where 句にサブクエリを配置することは、この問題を解決するための 1 つの戦略にすぎません。他の問題は、上記の最初のリンクで十分にカバーされています。extra() を使用しないと where 句のサブセレクトができないことはわかっていますが、おそらく他の方法の 1 つが新しい集計機能によって可能になったと思いました。