employee = Employee.objects.filter('age' = 99)
このクエリーセットは空であると仮定します。;クエリーセットのデフォルト値を持つことが可能です
employee[0]
を使用すると、インデックスから範囲外のエラーが返されるため、ここではデフォルト値としてNoneを使用できますか?
`employee[0] or None`? # This won't work, but this is what I mean.
employee = Employee.objects.filter('age' = 99)
このクエリーセットは空であると仮定します。;クエリーセットのデフォルト値を持つことが可能です
employee[0]
を使用すると、インデックスから範囲外のエラーが返されるため、ここではデフォルト値としてNoneを使用できますか?
`employee[0] or None`? # This won't work, but this is what I mean.
get
を使用し、ないfilter
:
employee = Employee.objects.get(age = 99)
それが存在しない場合キャッチする必要があるEmployee.DoesNotExist
例外が発生します。 99歳の従業員が2人以上いる場合は、catchする可能性があるEmployee.MultipleObjectsReturned例外が発生します。
あなたが怠け者なら、いつもdjango-annoyingのget_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
これは動作するはずです:あなただけの単一のインスタンスを取得したい場合は、
employee[0] if employee else None
これは同じと思いますemployee [0]またはNoneとして、インデックスが範囲外になります。 – user469652
いいえ、そうではありません。従業員がTrueのような値である場合に限り、それはemployee [0]の値を計算します。空のQuerySetはfalseのような値なので、空のQuerySetがある場合はNoneを返します。 – ikostia
first_employee = employee[0] if employee.count() > 0 else None
これは悪いです。私はそれがまったく動作するかどうかはわかりませんが、たとえそれがデータベースに2つのSQLクエリーを取得したとしても、1つはカウント用、もう1つは従業員用です。 Django QuerySetは怠惰なので、初めてデータを取得しようとしているときにだけ計算されます。この場合、employee.count()を書くときにこれを実行しようとしています。 Djangoは "SECELE COUNT()FROM ..."というクエリーをデータベースに渡し、数字を返します。しかし、従業員[0]をやろうとすると、Djangoはもう一度データベースをクエリしなければなりません! (または、まったく失敗する、わからない)。とにかく、これはそのような簡単な機能を実装するための非常に悪い方法です。 – ikostia
あなたはクエリセットが1つのまたは0のいずれかの結果を返すことが保証されて知っている場合にのみ意味をなすことが
employee = Employee.objects.filter(age=99).first()
注、:、あなただけ行うことができますので。
ご意見をお聞かせください。 – user469652
http://stackoverflow.com/questions/4722375/how-to-represent-and-in-django-orm-query.....新しい質問をするのではなく、古い質問を編集する必要があります – crodjer