2017-08-22 16 views
2

Django ORMを使用してこのタイプのwhere句を生成するにはどうすればよいですか?Django:タプルを組み合わせた列をフィルタリングする

where (datetime, id) < (%last_datetime, %last_id) 

背景

私が持っているこのようなモデル:

class Messages(models.Model): 
    # Implicit "id" serial primary key 
    datetime = models.DateTimeField(db_index=True) 
    message = models.CharField(max_length=1024) 

私はdatetimeでメッセージをソートし、複数のメッセージがある場合、一貫したソートのためのタイブレーカーとしてidを使用同じdatetimeは:

Messages.objects.order_by('datetime', 'id') 

これで、既知のメッセージの前に注文されたメッセージを除外する必要があります。

答えて

0

あなたはobjects.filter()を使用することができます。

relevant_messages = Messages.objects.filter(datetime__range=[start_date_string, end_date_string]) 

私はまた、あなたが連鎖あなたorder_by()filter()が一緒に呼び出すことができますかなり確信している:ビット複雑

relevant_messages = Messages.objects.order_by('datetime', 'id').filter(datetime__range=[start_date_string, end_date_string]) 
+0

ありがとうございますが、これは機能しませんフィルタに 'id'を含めます。私が示した 'where'節は、値をリレーションに組み合わせ、リレーションを比較することで動作します。これは、Pythonのタプルを比較するのと非常に似ています。 –

1

が、私はこれがうまくいくと仮定します:

Messages.objects.filter(datetime__lte=x).exclude(datetime=x, id__gt=y) 
+0

ありがとうございます。私は 'Q'オブジェクトを使って同様の解決策を考え出しました。受け入れる前に、私はちょっと待って、誰かがより簡単な解決法を知っているかどうかを確認し、希望のタイプのクエリ(または同様のパフォーマンスを持つクエリ)を生成するかどうかを確認します。 –

関連する問題