检查对象是否存在

sin*_*inθ 51 python database django model view

我需要检查是否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'])
Run Code Online (Sandbox Code Playgroud)

mpa*_*paf 97

从逻辑和效率的角度来看,我认为最简单的方法是使用queryset的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
Run Code Online (Sandbox Code Playgroud)


jon*_*shf 53

由于filter回报QuerySet,你可以使用计数来检查了许多成果是如何返回.这假设您实际上不需要结果.

num_results = User.objects.filter(email = cleaned_info['username']).count()
Run Code Online (Sandbox Code Playgroud)

在查看文档之后,如果您计划稍后使用结果,最好只在您的过滤器上调用len,因为您只会进行一次SQL查询:

count()调用在后台执行SELECT COUNT(*),因此你应该总是使用count()而不是将所有记录加载到Python对象中并在结果上调用len()(除非你需要加载对象)无论如何,进入内存,在这种情况下len()会更快).

num_results = len(user_object)
Run Code Online (Sandbox Code Playgroud)

  • 虽然`.count()`有效,但你也可以使用`.exists()`.https://docs.djangoproject.com/en/dev/ref/models/querysets/#exists (71认同)
  • 我添加上面的注释,虽然.count()确实有效,但如果count> 1则会慢于.exists(),并且计数越大它将变得越慢 (3认同)

par*_*han 10

如果用户存在,您可以获取该用户,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
Run Code Online (Sandbox Code Playgroud)


Dav*_*Lam 6

空QuerySet的布尔值也是False,所以你也可以......

...
if not user_object:
   do insert or whatever etc.
Run Code Online (Sandbox Code Playgroud)

  • 这不是非常有效,因为它将评估查询,并且当对象确实存在时,它将把它们加载到内存中 (2认同)

Cés*_*sar 5

你也可以使用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!
    ...
Run Code Online (Sandbox Code Playgroud)