2011-01-18 10 views
5
employee = Employee.objects.filter('age' = 99) 

このクエリーセットは空であると仮定します。;クエリーセットのデフォルト値を持つことが可能です

employee[0]を使用すると、インデックスから範囲外のエラーが返されるため、ここではデフォルト値としてNoneを使用できますか?

`employee[0] or None`? # This won't work, but this is what I mean. 
+0

ご意見をお聞かせください。 – user469652

+0

http://stackoverflow.com/questions/4722375/how-to-represent-and-in-django-orm-query.....新しい質問をするのではなく、古い質問を編集する必要があります – crodjer

答えて

9

getを使用し、ないfilter

employee = Employee.objects.get(age = 99) 

それが存在しない場合キャッチする必要があるEmployee.DoesNotExist例外が発生します。 99歳の従業員が2人以上いる場合は、catchする可能性があるEmployee.MultipleObjectsReturned例外が発生します。

あなたが怠け者なら、いつもdjango-annoyingget_object_or_Noneがあります!

from annoying.functions import get_object_or_None 

obj = get_object_or_None(Employee, age=99) 

あなたはジャンゴ・迷惑のすべてを使用しない場合、あなたはいつもどこかでget_object_or_Noneを追加することができ、それだけで次のようになりますジャンゴ> = 1.6 first方法がありますオン

def get_object_or_None(klass, *args, **kwargs): 
    """ 
    Uses get() to return an object or None if the object does not exist. 

    klass may be a Model, Manager, or QuerySet object. All other passed 
    arguments and keyword arguments are used in the get() query. 

    Note: Like with get(), a MultipleObjectsReturned will be raised if 
    more than one object is found. 
    """ 
    queryset = _get_queryset(klass) 
    try: 
     return queryset.get(*args, **kwargs) 
    except queryset.model.DoesNotExist: 
     return None 
3

これは動作するはずです:あなただけの単一のインスタンスを取得したい場合は、

employee[0] if employee else None 
+0

これは同じと思いますemployee [0]またはNoneとして、インデックスが範囲外になります。 – user469652

+2

いいえ、そうではありません。従業員がTrueのような値である場合に限り、それはemployee [0]の値を計算します。空のQuerySetはfalseのような値なので、空のQuerySetがある場合はNoneを返します。 – ikostia

1
first_employee = employee[0] if employee.count() > 0 else None 
+2

これは悪いです。私はそれがまったく動作するかどうかはわかりませんが、たとえそれがデータベースに2つのSQLクエリーを取得したとしても、1つはカウント用、もう1つは従業員用です。 Django QuerySetは怠惰なので、初めてデータを取得しようとしているときにだけ計算されます。この場合、employee.count()を書くときにこれを実行しようとしています。 Djangoは "SECELE COUNT()FROM ..."というクエリーをデータベースに渡し、数字を返します。しかし、従業員[0]をやろうとすると、Djangoはもう一度データベースをクエリしなければなりません! (または、まったく失敗する、わからない)。とにかく、これはそのような簡単な機能を実装するための非常に悪い方法です。 – ikostia

3

あなたはクエリセットが1つのまたは0のいずれかの結果を返すことが保証されて知っている場合にのみ意味をなすことが

employee = Employee.objects.filter(age=99).first() 

注、:、あなただけ行うことができますので。

関連する問題