【问题标题】:Check if an object exists检查对象是否存在
【发布时间】:2012-07-27 17:02:21
【问题描述】:

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

【问题讨论】:

  • 我不明白你在做什么。您是否尝试检查用户是否已经存在以引发错误?为什么需要检查?为什么要在“表单视图”中这样做?尝试回答这个问题,看看我们是否可以更好地帮助您...为您的问题添加上下文,而不仅仅是您想到的问题。有时您认为自己遇到的问题并不是真正的问题,所以您提出的问题不是正确的......

标签: python database django view model


【解决方案1】:

我认为从逻辑和效率的角度来看,最简单的方法是使用查询集的 exists() 函数,记录在这里:

https://docs.djangoproject.com/en/stable/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

【讨论】:

  • @sinθ 似乎是一个更恰当的接受答案
【解决方案2】:

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

【讨论】:

【解决方案3】:

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

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

【讨论】:

  • 这不是很有效,因为它会评估查询,当对象确实存在时,它会将它们加载到内存中
【解决方案4】:

您也可以使用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】:

    你可以使用:

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

    【讨论】:

      【解决方案6】:

      如果用户存在,您可以在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
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2017-05-13
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-09-26
        • 2018-03-16
        • 2014-03-19
        • 1970-01-01
        相关资源
        最近更新 更多