0

Ubuntu 13.04でPython 2.7でDjango 1.4を使用しています。

Django でのリレーションシップの使用order_by()とクロス関係に問題があることは知っています。distinct()これを克服するために提案されている解決策のほとんどは、集約を使用することです。私の場合、これを行う方法がわかりません。

QuerySet事前にフィルタリングされた があります。2 つのフィールドで並べ替えてから、個別の外部キーで結果を取得する必要があります。

class Contract(models.Model):
    rpl = models.DecimalField(max_digits=20, decimal_places=2, default=0)
    priority = models.IntegerField(default=0)

class Offer(models.Model):
    contract = models.ForeignKey(Contract)
    product = models.ForeignKey(Product)

最初に契約の優先順位、次に契約 rpl の順に並べられたオファーのリストを取得する必要があります。その結果、異なる製品のオファーが必要です。

qs.order_by('-contract__priority', '-contract__rpl').distinct('product')

Djangoでこれをエレガントに行うにはどうすればよいですか?

4

1 に答える 1

1

必要なのは GROUP BY ステートメントのようですが、残念ながら django はそれを提供していません - この質問Django: Group by?を参照してください。

個人的には、おそらく別の角度からアプローチし、代わりに Product クエリセットを使用します。オファー フィールドをフィルタリングし、注釈付きの優先度/rpl 値で注文できます。次に、製品ごとにオファーの詳細を個別に取得する必要があります。これは行ごとに余分なクエリを実行することを意味しますが、これが最善の方法かもしれません。例えば:

Product.objects.filter(offer__...=...) \
               .annotate(priority=models.Max('offer__contract__priority'),
                         rpl=models.Max('offer__contract__rpl')) \ 
               .order_by('-priority', '-rpl')
于 2013-10-17T09:08:41.020 に答える