特定のクエリセットの最後のレコードを取得するにはどうすればよいですか?
回答:
編集:あなたは今使用する必要があります Entry.objects.latest('pub_date')
あなたは単にこのようなことをすることができますreverse()
:
queryset.reverse()[0]
また、Djangoドキュメントからのこの警告に注意してください:
...
reverse()
通常、順序が定義されているQuerySetでのみ呼び出す必要があることに注意してください(たとえば、デフォルトの順序を定義するモデルに対してクエリを実行する場合、またはを使用する場合order_by()
)。特定のに対してそのような順序が定義されていない場合、それをQuerySet
呼び出しreverse()
ても実際の効果はありません(順序はreverse()
、を呼び出す前は未定義であり、その後も未定義のままになります)。
latest(field_name=None)
日付フィールドとして指定されたfield_nameを使用して、テーブル内の最新のオブジェクトを日付別に返します。この例では、次の
pub_date
フィールドに従って、テーブル内の最新のエントリを返します 。
Entry.objects.latest('pub_date')
それを行う最も簡単な方法は次のとおりです。
books.objects.all().last()
また、これを使用して、次のように最初のエントリを取得します。
books.objects.all().first()
books.objects.last()
そしてbooks.objects.first()
、トリックを行う必要があります。
XYZ.objects.first()
と 一緒に受け入れられる答えでなければなりませんXYZ.objects.last()
クエリセットがすでに使い果たされている場合は、別のdbヒントを回避するためにこれを行うことができます-
last = queryset[len(queryset) - 1] if queryset else None
使用しないでくださいtry...except...
。この場合、
DjangoはスローIndexError
しません。またはを
スローします(-Oオプションを指定してPythonを実行する場合)AssertionError
ProgrammingError
django 1.6以降を使用している場合、新しいAPIが導入されたため、はるかに簡単になりました-
Model.object.earliest()
それは逆方向でlatest()を与えます。
ps-私はその古い質問を知っています。誰かがこの質問にたどり着くように投稿します。彼らはこの新しい機能を知り、古い方法を使用することはありません。
Model.objects.last()
またはを使用できますModel.objects.first()
。いいえの場合ordering
が定義されている場合、クエリセットは主キーに基づいて順序付けられます。動作クエリセットの順序付けが必要な場合は、最後の2つのポイントを参照できます。
これを行うことを考えている場合は、クエリセットのModel.objects.all().last()
最後のModel.objects.all().first()
要素を取得して最初の要素を取得するか、filters
何も考えずにます。次に、以下のいくつかの警告を参照してください。
ここで注意すべき重要な部分は、何も含めていない場合です ordering
は、モデルに、データは任意の順序である可能性があり、予期されていなかったランダムな最後または最初の要素があることです。
例えば。Model1
2つの列id
と2つの列を持つという名前のモデルがあるとします。item_count
[定義された順序はありません] 10にID 1を持つ10行で
このようにModel.objects.all()。last()をフェッチすると、10個の要素のリストから任意の要素を取得できます。はい、デフォルトの順序がないため、ランダムです。
では、何ができるでしょうか?
ordering
モデルの1つまたは複数のフィールドに基づいて定義できます。パフォーマンスにも問題がありますので、そちらもご確認ください。参照:ここorder_by
、フェッチ中に使用できます。このような:Model.objects.order_by('item_count').last()
現在の順序を気にすることなく、最も簡単な方法は、QuerySetをリストに変換して、Pythonの通常の負のインデックスを使用できるようにすることです。そのようです:
list(User.objects.all())[-1]