2016-08-23 1 views
1

Django 1.6では、クエリーセットの最初の要素を取得するために.first()を導入しました。 、最初のものはより高く評価方法だろう許しを依頼する神託の方法に続いてObjectDoesNotExistと.filter()。first()を比較し、Noneをチェックする

user_id = 42 
obj = User.objects.filter(id=user_id).first() 
if not obj: 
    raise Exception("Invalid user id given") 

user_id = 42 
try: 
    obj = User.objects.get(id=user_id) 
except ObjectDoesNotExist: 
    raise Exception("Invalid user id given") 

と: [Source]

は今2つの要素を取得する方法がありますつかいます。 しかし、2つ目は理解しやすく、1行短くなっています。

1:これら2つのコードスニペットの間には速度に違いはありますか?

Q2:単一のオブジェクトを取得するのに適した方法はどれですか?

答えて

3

2つのセマンティクスと異なるガジェットがあります。主な違いは、複数の一致するオブジェクトを処理する方法です。

.get()は、複数のオブジェクトが指定されたクエリと一致する場合に例外を発生させます。したがって、一意のプロパティ(たとえば、id)またはプロパティのセットに基づいてアイテムを取得するには、.get()を使用する必要があります。

.first()は、複数のオブジェクトが指定されたクエリと一致する場合、定義された順序に基づいて最初のアイテムを返します。単一の項目が必要なときに非一意のプロパティをフィルタリングするにはこれを使用します。最初の項目はいくつかの(おそらく未定義の)順序に基づいています。

したがって、.get()は、正確に1つの項目がクエリと一致することを保証しますが、.first()は、指定された順序に基づいて最初の項目を返すことを保証します。

これらのオブジェクトが欠落しているオブジェクトを処理する方法は、セマンティクスの場合よりです。例外をNoneまたはそれ以外の方法に変換するのは簡単です。ここでは1行を保存するかもしれませんが、私はこれを使って1つの行を使用するという決意を下しません。パフォーマンスの差も無視できますが、おそらくクエリの結果によって異なります。

関連する問題