まず、各リクエストに対して明示的なクエリをコーディングするため、ほぼすべてのリクエストでこれが本当に必要であることを確認します。get
クエリは、遅延とは対照的に即時ですfilter
。もっと怠惰にしたい場合は、 get を小さな「get_wedding」ラッパーでラップするか、 afilter
を使用してリストから取得することができます...
def add_wedding_context(request):
id_ = request.GET.get('wedding_id', None)
wedding = None
if id_ is not None:
try:
wedding = Wedding.objects.get(id=id_)
except Wedding.DoesNotExist:
pass
return {'wedding':wedding}
遅延アプローチを試して、実際にオブジェクトを使用する場合にのみクエリが実行されるようにする場合は、遅延オブジェクトでラップできます。
from django.utils.functional import SimpleLazyObject
from functools import partial
def get_wedd_or_none(id_):
try:
return Wedding.objects.get(id=id_)
except Wedding.DoesNotExist:
return None
def add_wedding_context(request):
id_ = request.GET.get('wedding_id', None)
if id_ is not None:
lazy = SimpleLazyObject(partial(get_wedd_or_none, id_))
return {'wedding': lazy}
else:
return {'wedding': None}