【问题标题】:argument of type 'QuerySet' is not iterable Django error'QuerySet' 类型的参数是不可迭代的 Django 错误
【发布时间】:2020-04-03 09:43:21
【问题描述】:

在我的 web 应用中,我有一个好友功能,但是其中一个 if 语句会产生错误

这是我的 UserProfileInfo 模型

class UserProfileInfo(models.Model):
    connection = models.ManyToManyField(User,blank=True,related_name='follow_profile')

现在这是我的观点:

def friend_actions(request,username=None):
    current_user = request.user.userprofileinfo
    user = request.user
    # username = get("username")
    username = User.objects.get(username=username)
    other_user = get_object_or_404(UserProfileInfo,user__username=username)
    # other_user = UserProfileInfo.objects.get(username=username)
    url = other_user.get_absolute_url()
    if other_user in current_user.connection.all():
        current_user.connection.remove(other_user)
    else:
        current_user.connection.add(other_user)
    return HttpResponseRedirect(url)

但是,这会产生以下错误:

'QuerySet' 类型的参数不可迭代

完整的追溯

Traceback:

File "C:\Users\User\.virtualenvs\interests-site-Ho6yLlHE\lib\site-packages\django\core\handlers\exception.py" in inner
  34.             response = get_response(request)

File "C:\Users\User\.virtualenvs\interests-site-Ho6yLlHE\lib\site-packages\django\core\handlers\base.py" in _get_response
  115.                 response = self.process_exception_by_middleware(e, request)

File "C:\Users\User\.virtualenvs\interests-site-Ho6yLlHE\lib\site-packages\django\core\handlers\base.py" in _get_response
  113.                 response = wrapped_callback(request, *callback_args, **callback_kwargs)

File "C:\Users\User\interests-site\interests-drf\mainapp\views.py" in friend_actions
  453.     if other_user in current_user.connection.all():

Exception Type: TypeError at /mainapp/profile/donnellan0007/connect/
Exception Value: argument of type 'QuerySet' is not iterable

我想知道如何阻止此错误的发生。我整天都被它难住了

【问题讨论】:

  • current_user.connection.filter(<your condition>).exists()之类的查询替换in检查

标签: python django python-3.x django-models django-views


【解决方案1】:

这似乎是一个不时出现的错误,也就是 Heisenbug!

QuerySet 确实是一个可迭代的 (https://github.com/django/django/blob/master/django/db/models/query.py#L271)

Django 的论坛有一些关于此的信息 -

https://code.djangoproject.com/ticket/26600 https://github.com/PyCQA/pylint-django/issues/117

一般来说,问题似乎是由于 iter 内抛出异常(StopIteration 除外)。

您可以使用以下路线之一 -

  1. 强制列出查询集(不推荐)

  2. 使用条件过滤连接。在您的情况下,使用过滤器在连接中搜索 other_user

  3. 返回 values_list 值而不是 Queryset 并在其上执行“in”。

【讨论】:

  • .values_list() 仍然是 QuerySet,这可能是同一个问题。
猜你喜欢
  • 2020-03-14
  • 2022-11-29
  • 1970-01-01
  • 2021-02-14
  • 1970-01-01
  • 2023-02-20
  • 2021-10-28
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多