web-dev-qa-db-ja.com

オブジェクトが存在するかどうかを確認します

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'])
48
sinθ

filterQuerySetを返すため、 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)
50
joneshf

論理的かつ効率的な観点から最も簡単なのは、クエリセットの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
90
mpaf

空のQuerySetのブール値もFalseなので、実行することもできます...

...
if not user_object:
   do insert or whatever etc.
6
David Lam

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!
    ...
5
César

次を使用できます。

try:
   # get your models
except ObjectDoesNotExist:
   # do something
2
acarayol

ユーザーが存在する場合、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
0
paras chauhan