Model.objects.filter(...)
が何かを示しているかどうかを確認する必要がありますが、何も挿入する必要はありません。これまでの私のコードは次のとおりです。
user_pass = log_in(request.POST) # form class
if user_pass.is_valid():
cleaned_info = user_pass.cleaned_data
user_object = User.objects.filter(email = cleaned_info['username'])
filter
はQuerySet
を返すため、 count を使用して、返された結果の数を確認できます。これは、実際に結果が必要ないことを前提としています。
num_results = User.objects.filter(email = cleaned_info['username']).count()
ただし、ドキュメントを確認した後、1つのSQLクエリのみを作成するため、後で結果を使用する予定がある場合は、フィルターでlenを呼び出すことをお勧めします。
Count()呼び出しは、舞台裏でSELECT COUNT(*)を実行するため、すべてのレコードをPythonオブジェクトにロードしてlen()を呼び出すのではなく、常にcount()を使用する必要があります結果(とにかくオブジェクトをメモリにロードする必要がある場合を除き、その場合len()は高速になります)。
num_results = len(user_object)
論理的かつ効率的な観点から最も簡単なのは、クエリセットのexists()関数を使用することです。
https://docs.djangoproject.com/en/dev/ref/models/querysets/#Django.db.models.query.QuerySet.exists
したがって、上記の例では単純に次のように記述します。
if User.objects.filter(email = cleaned_info['username']).exists():
# at least one object satisfying query exists
else:
# no object satisfying query exists
空のQuerySetのブール値もFalseなので、実行することもできます...
...
if not user_object:
do insert or whatever etc.
get_object_or_404() を使用することもでき、Http404
オブジェクトが見つからなかった場合:
user_pass = log_in(request.POST) #form class
if user_pass.is_valid():
cleaned_info = user_pass.cleaned_data
user_object = get_object_or_404(User, email=cleaned_info['username'])
# User object found, you are good to go!
...
次を使用できます。
try:
# get your models
except ObjectDoesNotExist:
# do something
ユーザーが存在する場合、user_objectでユーザーを取得できます。それ以外の場合、user_objectはnoneになります。
try:
user_object = User.objects.get(email = cleaned_info['username'])
except User.DoesNotExist:
user_object = None
if user_object:
# user exist
pass
else:
# user does not exist
pass