Djangoのフィルターで最新のレコードを取得する


92

最新のDjangoモデルオブジェクトを取得しようとしていますが、成功しないようです。

これらはどちらも機能していません。

obj = Model.objects.filter(testfield=12).latest()
obj = Model.objects.latest().filter(testfield=12)

3
試したことはありますか:obj= Model.objects.filter(testfield=12).order_by('-id')[:1]
キャサリン2013年

@キャサリン、チャームのように働いています!:D。あなたは私がそれをチェックできるようにこれを答えとして書きたいですか?
doniyor 2013年

2018年NewsPostImage.objects.filter(newsPostTarget=img_id).first()。それが役に立てば幸い。
ngatiaFrankline19年

回答:


103
obj= Model.objects.filter(testfield=12).order_by('-id')[0]

10
@DaveMerwinそれは正しくありません。この問題を解決する方法は複数あり、この答えと他の答えの両方が正しいです。
ジョーダン

1
これは、idがシーケンスされた主キー整数であると想定していることに注意してください。これは通常djangoのデフォルトですが、そうでない場合もあります。
dalore 2017

2
フィルタが空のリストを返す可能性があるため、これは危険な場合があります
Kingston Chan

'-id'は順序を逆にするために使用されます!
インドラ

3
多分[0]の代わりに.first()?
fevgenym

121

djangoのドキュメントを参照してください:https//docs.djangoproject.com/en/dev/ref/models/querysets/#latest

latest()でフィールドを指定する必要があります。例えば。

obj= Model.objects.filter(testfield=12).latest('testfield')

または、モデルのメタでget_latest_byが指定されている場合は、へのfield_name引数を省略できますearliest() or latest()。Djangoはget_latest_byデフォルトで指定されたフィールドを使用します。


2
「テストフィールド」は日付フィールドである必要がありますか?
tani-rokk 2015年


17

latestは実際には日付フィールドで機能するように設計されています(おそらく他の合計注文タイプでも機能しますが、確かではありません)。また、フィールド名を指定せずに使用できる唯一の方法は、ここget_latest_byで説明するように、メタ属性を設定することです。


8
これは、主キーとの仕事は、あなたは常にこのような何かを行うことができない:Model.objects.latest('id')
Ander


0

ここでこれと比較することができます。

画像

latest('created')order_by('-created').first() 私が間違っている場合は私を訂正してくださいと同じです

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.