1. ホーム
  2. python

[解決済み] 異なるカテゴリから最も新しいオブジェクトを取得する Django クエリ

2023-08-17 01:30:42

質問

2つのモデル AB . すべて B オブジェクトの外部キーは A オブジェクトへの外部キーを持ちます。のセットが与えられると A オブジェクトのセットがある場合、ORM を使用して、一連の B オブジェクトを取得する方法はありますか? A オブジェクトを含む。

以下は簡略化した例です。

class Bakery(models.Model):
    town = models.CharField(max_length=255)

class Cake(models.Model):
    bakery = models.ForeignKey(Bakery, on_delete=models.CASCADE)
    baked_at = models.DateTimeField()

そこで、アメリカのAnytownにある各ベーカリーで焼かれた最も新しいケーキを返すクエリを探しています。

どのように解決するのですか?

私の知る限り、Django ORM にこれを行うワンステップの方法はありませんが、2つのクエリに分割することは可能です。

from django.db.models import Max

bakeries = Bakery.objects.annotate(
    hottest_cake_baked_at=Max('cake__baked_at')
) 
hottest_cakes = Cake.objects.filter(
    baked_at__in=[b.hottest_cake_baked_at for b in bakeries]
)

ケーキのIDがbake_atのタイムスタンプと一緒に進行している場合、上記のコードを単純化し、曖昧さをなくすことができます(2つのケーキが同時に到着した場合、両方を取得することができます)。

from django.db.models import Max

hottest_cake_ids = Bakery.objects.annotate(
    hottest_cake_id=Max('cake__id')
).values_list('hottest_cak‌​e_id', flat=True)

hottest_cakes = Cake.objects.filter(id__in=hottest_cake_ids)

ちなみに、これについては、かつて私の同様の質問に答えてくれたDaniel Rosemanに感謝します。

http://groups.google.pl/group/django-users/browse_thread/thread/3b3cd4cbad478d34/3e4c87f336696054?hl=pl&q=

もし上記の方法が遅すぎるのであれば、2 番目の方法もあります - 関連するベーカリーで最もホットなケーキだけを生成するカスタム SQL を書き、それをデータベース VIEW として定義し、そのためのアンマネージド Django モデルを書くことができます。これは上記の django-users のスレッドでも言及されています。元のコンセプトへの直接のリンクはこちらです。

http://web.archive.org/web/20130203180037/http://wolfram.kriesing.de/blog/index.php/2007/django-nice-and-critical-article#comment-48425

これが役立つといいのですが。