クエリセットの最後のレコードを取得する


回答:


81

編集:あなたは今使用する必要があります Entry.objects.latest('pub_date')


あなたは単にこのようなことをすることができますreverse()

queryset.reverse()[0]

また、Djangoドキュメントからのこの警告に注意してください:

...reverse()通常、順序が定義されているQuerySetでのみ呼び出す必要があることに注意してください(たとえば、デフォルトの順序を定義するモデルに対してクエリを実行する場合、またはを使用する場合order_by())。特定のに対してそのような順序が定義されていない場合、それをQuerySet呼び出しreverse()ても実際の効果はありません(順序はreverse()、を呼び出す前は未定義であり、その後も未定義のままになります)。


2
django docsで述べられているように、: "reverse()は通常、順序が定義されているQuerySetでのみ呼び出す必要があります(たとえば、デフォルトの順序を定義するモデルに対してクエリを実行する場合、またはorder_by()を使用する場合)。このような順序は特定のQuerySetに対して定義されており、reverse()を呼び出しても実際の効果はありません(reverse()を呼び出す前は順序が未定義であり、その後も未定義のままになります)。」
2010

6
2017年、承認された回答は現在古くなっています。以下に示すように、queryset.last()を使用する必要があります。
wobbily_col 2017

134

Django Doc

latest(field_name=None) 日付フィールドとして指定されたfield_nameを使用して、テーブル内の最新のオブジェクトを日付別に返します。

この例では、次のpub_dateフィールドに従って、テーブル内の最新のエントリを返します 。

Entry.objects.latest('pub_date')

5
これはそれを行うためのきちんとした方法です。また、ドキュメントに従って、「モデルのメタでget_latest_byが指定されている場合は、field_name引数をlatest()に省略できます」。
フレドリックMöllerstrand

50

それを行う最も簡単な方法は次のとおりです。

books.objects.all().last()

また、これを使用して、次のように最初のエントリを取得します。

books.objects.all().first()

16
books.objects.last() そしてbooks.objects.first()、トリックを行う必要があります。
chandan 2016年

これは、XYZ.objects.first()と 一緒に受け入れられる答えでなければなりませんXYZ.objects.last()
slajma 2018

ArnaudPのやり方がより適切だと思います。これは、間違いがなければ、DB内のすべてのアイテムを解凍し、後でDBクエリを使用して最後のアイテムをプルします。
ラルコ

33

Django> = 1.6

フィルタに一致する最初または最後のオブジェクトを返す便利なメソッドであるQuerySetメソッドfirst()およびlast()が追加されました。一致するオブジェクトがない場合はNoneを返します。


32

最初のオブジェクトを取得するには:

ModelName.objects.first()

最後のオブジェクトを取得するには:

ModelName.objects.last()

フィルタを使用できます

ModelName.objects.filter(name='simple').first()

これは私にとってはうまくいきます。


6

クエリセットがすでに使い果たされている場合は、別のdbヒントを回避するためにこれを行うことができます-

last = queryset[len(queryset) - 1] if queryset else None

使用しないでくださいtry...except...。この場合、
DjangoはスローIndexErrorしません。またはを
スローします(-Oオプションを指定してPythonを実行する場合)AssertionErrorProgrammingError


1
クエリセットがすでに順序付けられていると仮定すると、これが「トップアンサー」になるはずです。これは、データベースに再度アクセスしない唯一のソリューションだからです。
デビッド・D.

4

django 1.6以降を使用している場合、新しいAPIが導入されたため、はるかに簡単になりました-

Model.object.earliest()

それは逆方向でlatest()を与えます。

ps-私はその古い質問を知っています。誰かがこの質問にたどり着くように投稿します。彼らはこの新しい機能を知り、古い方法を使用することはありません。


3
ドキュメントから:earliest()およびlatest()には、モデルにfield_nameパラメーターまたは 'get_latest_by'のいずれかが必要です
panchicore 2014年

1

Model.objects.last()またはを使用できますModel.objects.first()。いいえの場合orderingが定義されている場合、クエリセットは主キーに基づいて順序付けられます。動作クエリセットの順序付けが必要な場合は、最後の2つのポイントを参照できます。

これを行うことを考えている場合は、クエリセットのModel.objects.all().last()最後のModel.objects.all().first()要素を取得して最初の要素を取得するか、filters何も考えずにます。次に、以下のいくつかの警告を参照してください。

ここで注意すべき重要な部分は、何も含めていない場合です orderingは、モデルに、データは任意の順序である可能性があり、予期されていなかったランダムな最後または最初の要素があることです。

例えば。Model12つの列idと2つの列を持つという名前のモデルがあるとします。item_count [定義された順序はありません] 10にID 1を持つ10行で

このようにModel.objects.all()。last()をフェッチすると、10個の要素のリストから任意の要素を取得できます。はい、デフォルトの順序がないため、ランダムです。

では、何ができるでしょうか?

  1. orderingモデルの1つまたは複数のフィールドに基づいて定義できます。パフォーマンスにも問題がありますので、そちらもご確認ください。参照:ここ
  2. またはorder_by、フェッチ中に使用できます。このような:Model.objects.order_by('item_count').last()

-5

現在の順序を気にすることなく、最も簡単な方法は、QuerySetをリストに変換して、Pythonの通常の負のインデックスを使用できるようにすることです。そのようです:

list(User.objects.all())[-1]

2
これにより、DBからすべてのオブジェクトがクエリされ、最初のオブジェクトが取得されます
warvariuc 2013年

いい視点ね!明らかにそれを通り抜けるとは思わなかった。.reverse()の答え(現在選択されている)が正しい方法です!
Josh Ourisman 2013年
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.