3

Order モデルと order_event モデルがあります。各 order_event には、注文する外部キーがあります。したがって、注文インスタンスから取得できます: myorder.order_event_set. すべての注文のリストを取得したいのですが、最後のイベントの日付で並べ替えたいです。次のようなステートメントは、最新のイベント日付でソートします。

queryset = Order.objects.all().annotate(
    latest_event_date=Max('order_event__event_datetime')
    ).order_by('latest_event_date')

しかし、私が本当に必要としているのは、A SUBSET OF EVENTS の最新の日付でソートされたすべての注文のリストです。たとえば、私のイベントは「スケジューリング」、「処理」などに分類されているため、最新のスケジューリング イベントでソートされたすべての注文のリストを取得できるはずです。この django doc (https://docs.djangoproject.com/en/dev/topics/db/aggregation/#filter-and-exclude) は、フィルターを使用して最新のスケジュール イベントを取得する方法を示していますが、これはスケジュールのない注文を除外しますイベント。

フィルタリングされたクエリセットを、スケジュール イベントが欠落している注文を戻すクエリセットと組み合わせることができると考えましたが、これを行う方法がよくわかりません。Python リストの使用に関連する回答を見ましたが、適切な django クエリセット (つまり、ページネーションを含むビューなど) を使用する方がはるかに便利です。

再編集: コメント/提案

class Order(models.Model):
    desc = models.CharField(max_length=30)

class Order_event(models.Model):
    order = models.ForeignKey(Order)
    event_datetime = models.DateTimeField(auto_now_add = True)

また、複数のステートメントで実行してもかまいません。また、私は巨大なデータセットを扱っていないので、orm の代わりに python を介してソートなどを行っても問題ありません。可能であれば、あなたが言及した理由から、SQLから離れたいと思います。別々の並べ替えられたクエリセットを組み合わせることは有望に思えますが、私は立ち往生しています。

4

2 に答える 2

1

わかりました、追加の方法でこれを達成できると思いますが、私が知る限り、純粋なデータベースに依存しない orm では達成できません。つまり、使用している db バックエンドで sql が機能することを確認し、django によるテーブル名のエイリアスに注意する必要がありますが、1 つのクエリですべてを実行できることも意味します。

これらの行に沿った何かが機能するはずです:

latest_event_subquery = 'select max(event_datetime) ' \
                        'from appname_order_event ' \
                        'where appname_order_event.category="scheduling" and ' \
                              'appname_order_event.event_id=appname_order.id'
queryset = Order.objects.extra(select={'latest_event_date': latest_event_subquery}).order_by('latest_event_date')

それは理にかなっていますか?

于 2012-12-07T08:29:30.087 に答える