2011-07-05 4 views
8

私はモデル "Post"を持つシンプルなブログアプリを持っています。djangoおそらく空のリストから0番目のアイテムを取得する方法

latest_post = Post.objects.order_by('-date_created')[0] 

エラーです:はIndexError:リストインデックスIは、Postモデル内のすべてのエントリを削除した場合、私は私がこのようにやった日付順ポストリストで最初の項目を参照しようとすると、私はエラーを取得します修正として範囲

のうち、私は次のようにアイテムを取得:

all_posts = Post.objects.order_by('-date_created') 
latest_post =() 
if (all_posts): 
    latest_post = all_posts[0] 

これは私のモデルにはアイテム「ポスト」は存在しない場合に動作し、例外がスローされません。 しかし私にとっては、これはあまりにも多くのコードのように、かなり簡単なことをするようです。私はdjango QuerySet APIを使ってこれを行うより良い方法があると仮定していますが、ドキュメントには何も見つかりません。

アイデア?

EDIT:Postモデルにアイテムが存在しない場合に奇妙な、これはエラーをスローしません:

latest_post_list = Post.objects.all().order_by('-date_created')[1:10] 

答えて

15

何を使用しないために、単純なPythonの修正は次のようになり、完全に期待される動作です。空リスト(またはこの場合はクエリーセット)はFalseに評価され、クエリーセットにインデックスを作成しません。一方、空のリストにインデックスを作成しようとすると(最初の方法と同じように)、IndexErrorがスローされます。

あなたが書いたことはうまくいくが、それは最高のものではない。これを書くためのより良い方法は、これはそれを書くよりPython的な方法であると読んで、あなたが何をしようとして理解しやすいですので

try: 
    latest_post = Post.objects.order_by('-date_created')[0] 
except IndexError: 
    latest_post = None 

ようなものです。それは、最新の()クエリセットメソッドを使用していることを、この第二の例では

あるいはさらに良い

try: 
    latest_post = Post.objects.latest('date_created') 
except Post.DoesNotExist: 
    latest_post = None 

注意してください。引数は単にフィールド名であり、-fieldnameではないことにも注意してください。また、あなたもあなたのモデルでメタクラスget_latest_by = 'date_created'を指定することができますし、行は単純にしてもこれは例外をスローしないであろうと、あなたはまだ上の空のリストの状態をチェックすることができるフィールド名引数

+1

+1は「try ... except」です。許可よりも許しを求める方が簡単です。 –

+2

+1は、問題を解決するためのより良い方法として最新のものを提案しています。 –

+0

'.latest()'はヌルエントリをフィルタリングせず、ヌルは最初に通常はソートします。したがって、日付がnullの場合は、Post.objects.exclude(date_created = None).latest( 'date_created') ' – rcoup

2

代わりにそのことについて奇妙

latest_post = Post.objects.order_by('-date_created')[0:1] 
2
latest_post = Post.objects.order_by('-date_created')[:1] 
if latest_post: 
    latest_post = latest_post[0] 

を指定しなくてもlatest_post = Post.objects.latest()となり、最新の投稿。

あなたの問題は、絶対インデックスIE [0]を使用することによって発生する可能性があります。スライス[:1]を使用すると、リスト内の最初のアイテムが存在する場合はそのリストが欲しいと言っています。存在しない場合は空のリストを取得します。

+0

が必要です。ステファン – Howard

+0

による修正と同様の回答です。' [:1] 'を使用する場合、if結果はありません。空リスト( '[]')があり、 'None'ではありません。 –

+0

空のリストの結果を反映するように訂正を修正しました。 – Howard

関連する問題