2012-07-30 146 views
26

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

我不了解你想要做什么。你是否试图检查用户是否已经存在以提出错误?你为什么需要检查?你为什么要在“表单视图”中执行此操作?试着回答这个问题,看看我们能否更好地帮助你......给你的问题添加一个背景,而不仅仅是你想到的问题。有时候你认为你的问题不是真正的问题,所以你问的问题是不正确的... – marianobianchi 2012-07-30 03:07:22

+0

可能重复[什么是正确的方式来验证,如果一个对象存在Django的观点,而不返回404?]( http://stackoverflow.com/questions/639836/what-is-the-right-way-to-validate-if-an-object-exists-in-a-django-view-without-r) – Wtower 2017-04-17 19:39:30

回答

33

由于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) 
+50

虽然'。 count()'确实有效,你也可以使用'.exists()'。 https://docs.djangoproject.com/en/dev/ref/models/querysets/#exists – 2012-07-30 02:17:25

+3

我想添加上面的评论,虽然.count()确实有效,但它会比.exists()if慢计数> 1,计数越大,它将变得越慢 – Bob 2014-10-02 04:26:52

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

空查询集的布尔值也为False,所以你也可以只是做...

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

这不是非常有效,因为它会评估查询,并且当对象存在时它会将它们加载到内存中 – mpaf 2014-02-13 09:50:00

2

您可以使用:

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