检查对象是否存在

时间:2012-07-30 01:45:10

标签: python database django view model

我需要检查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'])

6 个答案:

答案 0 :(得分:82)

我认为从逻辑和效率的角度来看,最简单的方法是使用查询集的 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

答案 1 :(得分:44)

由于filter会返回QuerySet,您可以使用count来检查返回的结果数量。这假设您实际上并不需要结果。

num_results = User.objects.filter(email = cleaned_info['username']).count()

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

  

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

num_results = len(user_object)

答案 2 :(得分:6)

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

...
if not user_object:
   do insert or whatever etc.

答案 3 :(得分: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!
    ...

答案 4 :(得分:3)

您可以使用:

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

答案 5 :(得分:1)

如果用户存在,则可以在user_object中获得该用户,否则user_object将为无。

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