djangoでは、フィールドでモデルをソートしてから最後のアイテムを取得するにはどうすればよいですか?
-
05-07-2019 - |
質問
具体的には、このようなフィールドを持つモデルがあります
pub_date = models.DateField("date published")
最新の pub_date
でオブジェクトを簡単に取得できるようにしたい。これを行う最も簡単/最良の方法は何ですか?
次のようなものが私が望むことをしますか?
Edition.objects.order_by('pub_date')[:-1]
解決
obj = Edition.objects.latest('pub_date')
get_latest_by
をモデルのメタに追加すると、次のことができるようになります
obj = Edition.objects.latest()
他のヒント
ハーレーの答えは、あなたがするように、特定のモデルのいくつかの順序付け基準に従って最新のものが必要な場合に行く方法ですが、一般的な解決策は順序付けを逆にして最初のアイテムを取得することです:
Edition.objects.order_by('-pub_date')[0]
注:
通常のPythonリストは、負のインデックスを受け入れます。これは、正の数のような先頭ではなく、リストの末尾からのオフセットを示します。ただし、負のインデックスを使用すると、QuerySetオブジェクトは
AssertionError: Negative indexing is not supported.を発生させます。そのため、insinが言ったことを行う必要があります。順序を逆にして、
0th
要素を取得します。
使用に注意してください
Edition.objects.order_by('-pub_date')[0]
空のQuerySetのインデックスを作成している可能性があるため。正しいPythonicアプローチが何であるかはわかりませんが、最も簡単なのはif / elseまたはtry / catchでラップすることです:
try:
last = Edition.objects.order_by('-pub_date')[0]
except IndexError:
# Didn't find anything...
しかし、@ Harleyが言ったように、日付で注文する場合、 latest()
が djangonic 方法です。
これはすでに回答されていますが、詳細については、 Django Book クエリセットでのデータのスライスについて説明する必要があります:
負のスライスはサポートされていないことに注意してください:
>>> Publisher.objects.order_by('name')[-1] Traceback (most recent call last): ... AssertionError: Negative indexing is not supported.
ただし、これは簡単に回避できます。 order_by()を変更するだけです 次のようなステートメント:
>>> Publisher.objects.order_by('-name')[0]
このような詳細については、リンクを参照してください。役に立てば幸いです!
所属していません StackOverflow