3

これが私の単純化されたモデルです:

class Item(models.Model):
    pass

class TrackingPoint(models.Model):
    item = models.ForeignKey(Item)
    created = models.DateField()
    data = models.IntegerField()

    class Meta:
        unique_together = ('item', 'created')

私のアプリケーションの多くの部分で、一連の を取得し、フィールドで並べ替えられた各アイテムから最新のフィールドでItem各アイテムに注釈を付ける必要があります。たとえば、クラスのインスタンスには 3 つのがあります。dataTrackingPointcreatedi1ItemTrackingPoint

tp1 = TrackingPoint(item=i1, created=date(2010,5,15), data=23)
tp2 = TrackingPoint(item=i1, created=date(2010,5,14), data=21)
tp3 = TrackingPoint(item=i1, created=date(2010,5,12), data=120)

フィールド値でi1注釈が付けられたインスタンスを取得するためのクエリが必要です。これは、フィールドで並べ替えられた最新の追跡ポイントです。そのクエリは、 をまったく含まないも返す必要があります。可能であれば、これを行うためにのメソッドを使用しないことを好みます。tp1.datatp1createdItemTrackingPointQuerySetextra

それが私がこれまでに試したことです...そして失敗しました:(

Item.objects.annotate(max_created=Max('trackingpoint__created'),
                      data=Avg('trackingpoint__data')).filter(trackingpoint__created=F('max_created'))

何か案は?

4

2 に答える 2

7

(TrackingPoint, Item) ペアを提供する単一のクエリを次に示します。

TrackingPoint.objects.annotate(max=Max('item__trackingpoint__created')).filter(max=F('created')).select_related('item').order_by('created')

TrackingPoints のないアイテムについては、個別にクエリを実行する必要があります。

于 2011-03-06T12:37:53.077 に答える
1

これはあなたの質問に対する直接の回答ではありませんが、あなたが説明したものを正確に必要としない場合は、グループごとに最大のソリューションに興味があるかもしれません。同様の質問に対する私の答えを見ることができます:

さまざまなカテゴリから最新のオブジェクトを取得する Django クエリ

-- これはあなたのケースに直接当てはまるはずです:

 items = Item.objects.annotate(tracking_point_created=Max('trackingpoint__created')) 
 trackingpoints = TrackingPoint.objects.filter(created__in=[b.tracking_point_created for b in items])

createdTrackingPoint モデルで日付が繰り返される場合、2 行目はあいまいな結果を生成する可能性があることに注意してください。

于 2010-05-15T07:36:18.653 に答える