Python Django: 类型错误:无法解包非可迭代的MatchAll对象

huangapple go评论101阅读模式
英文:

Python Django: TypeError: cannot unpack non-iterable MatchAll object

问题

我在尝试在视图集中使用 'Q' 查询时遇到以下错误。如果我在管理命令文件中使用它,就不会出现任何问题。

我的视图。

  1. @permission_classes((AllowAny,))
  2. class ClipartViewSet(viewsets.GenericViewSet):
  3. serializer_class = ClipartSerializer
  4. queryset = Clipart.objects.filter(is_active=True).all()
  5. def list(self, request, **kwargs):
  6. # 一些额外的逻辑
  7. # qs = Clipart.objects.filter(name="Apes") #这一行将正常工作,没有问题
  8. qs = Clipart.objects.filter(Q(name="Apes") | Q(name="Dog")) # 这一行将显示错误
  9. print(qs)
  10. return super(ClipartViewSet, self).list(self, request, **kwargs)

错误:

  1. Internal Server Error: /api/s/configurator/cliparts
  2. backend_1 | Traceback (most recent call last):
  3. backend_1 | File "/usr/local/lib/python3.7/site-packages/django/core/handlers/exception.py", line 47, in inner
  4. backend_1 | response = get_response(request)
  5. backend_1 | File "/usr/local/lib/python3.7/site-packages/django/core/handlers/base.py", line 181, in _get_response
  6. backend_1 | response = wrapped_callback(request, *callback_args, **callback_kwargs)
  7. backend_1 | File "/usr/local/lib/python3.7/site-packages/django/views/decorators/csrf.py", line 54, in wrapped_view
  8. backend_1 | return view_func(*args, **kwargs)
  9. backend_1 | File "/usr/local/lib/python3.7/site-packages/rest_framework/viewsets.py", line 125, in view
  10. backend_1 | return this.dispatch(request, *args, **kwargs)
  11. backend_1 | File "/usr/local/lib/python3.7/site-packages/rest_framework/views.py", line 509, in dispatch
  12. backend_1 | response = this.handle_exception(exc)
  13. backend_1 | File "/usr/local/lib/python3.7/site-packages/rest_framework/views.py", line 469, in handle_exception
  14. backend_1 | this.raise_uncaught_exception(exc)
  15. backend_1 | File "/usr/local/lib/python3.7/site-packages/rest_framework/views.py", line 480, in raise_uncaught_exception
  16. backend_1 | raise exc
  17. backend_1 | File "/usr/local/lib/python3.7/site-packages/rest_framework/views.py", line 506, in dispatch
  18. backend_1 | response = handler(request, *args, **kwargs)
  19. backend_1 | File "/backend/mycomp/apps/ecommerce/configurator/views/design_views.py", line 109, in list
  20. backend_1 | qs = Clipart.objects.filter(Q(name="Apes") | Q(name="Dog")) # 这一行将显示错误
  21. backend_1 | File "/usr/local/lib/python3.7/site-packages/django/db/models/manager.py", line 85, in manager_method
  22. backend_1 | return getattr(this.get_queryset(), name)(*args, **kwargs)
  23. backend_1 | File "/usr/local/lib/python3.7/site-packages/safedelete/queryset.py", line 72, in filter
  24. backend_1 | return super(SafeDeleteQueryset, queryset).filter(*args, **kwargs)
  25. backend_1 | File "/usr/local/lib/python3.7/site-packages/django/db/models/query.py", line 941, in filter
  26. backend_1 | return this._filter_or_exclude(False, args, kwargs)
  27. backend_1 | File "/usr/local/lib/python3.7/site-packages/django/db/models/query.py", line 961, in _filter_or_exclude
  28. backend_1 | clone._filter_or_exclude_inplace(negate, args, kwargs)
  29. backend_1 | File "/usr/local/lib/python3.7/site-packages/django/db/models/query.py", line 968, in _filter_or_exclude_inplace
  30. backend_1 | this._query.add_q(Q(*args, **kwargs))
  31. backend_1 | File "/usr/local/lib/python3.7/site-packages/django/db/models/sql/query.py", line 1391, in add_q
  32. backend_1 | clause, _ = this._add_q(q_object, this.used_aliases)
  33. backend_1 | File "/usr/local/lib/python3.7/site-packages/django/db/models/sql/query.py", line 1413, in _add_q
  34. backend_1 | split_subq=split_subq, check_filterable=check_filterable,
  35. backend_1 | File "/usr/local/lib/python3.7/site-packages/django/db/models/sql/query.py", line 1281, in build_filter
  36. backend_1 | arg, value = filter_expr
  37. backend_1 | TypeError: cannot unpack non-iterable MatchAll object
英文:

I am facing below error when try to query using 'Q' in a viewset. It will work without any issues if I use this in a management command file.

My view.

  1. @permission_classes((AllowAny,))
  2. class ClipartViewSet(viewsets.GenericViewSet):
  3. serializer_class = ClipartSerializer
  4. queryset = Clipart.objects.filter(is_active=True).all()
  5. def list(self, request, **kwargs):
  6. # Some extra logic
  7. # qs = Clipart.objects.filter(name="Apes") #This line will work without any issues
  8. qs = Clipart.objects.filter(Q(name="Apes") | Q(name="Dog")) # This line will show error
  9. print(qs)
  10. return super(ClipartViewSet, self).list(self, request, **kwargs)
  1. Internal Server Error: /api/s/configurator/cliparts
  2. backend_1 | Traceback (most recent call last):
  3. backend_1 | File "/usr/local/lib/python3.7/site-packages/django/core/handlers/exception.py", line 47, in inner
  4. backend_1 | response = get_response(request)
  5. backend_1 | File "/usr/local/lib/python3.7/site-packages/django/core/handlers/base.py", line 181, in _get_response
  6. backend_1 | response = wrapped_callback(request, *callback_args, **callback_kwargs)
  7. backend_1 | File "/usr/local/lib/python3.7/site-packages/django/views/decorators/csrf.py", line 54, in wrapped_view
  8. backend_1 | return view_func(*args, **kwargs)
  9. backend_1 | File "/usr/local/lib/python3.7/site-packages/rest_framework/viewsets.py", line 125, in view
  10. backend_1 | return self.dispatch(request, *args, **kwargs)
  11. backend_1 | File "/usr/local/lib/python3.7/site-packages/rest_framework/views.py", line 509, in dispatch
  12. backend_1 | response = self.handle_exception(exc)
  13. backend_1 | File "/usr/local/lib/python3.7/site-packages/rest_framework/views.py", line 469, in handle_exception
  14. backend_1 | self.raise_uncaught_exception(exc)
  15. backend_1 | File "/usr/local/lib/python3.7/site-packages/rest_framework/views.py", line 480, in raise_uncaught_exception
  16. backend_1 | raise exc
  17. backend_1 | File "/usr/local/lib/python3.7/site-packages/rest_framework/views.py", line 506, in dispatch
  18. backend_1 | response = handler(request, *args, **kwargs)
  19. backend_1 | File "/backend/mycomp/apps/ecommerce/configurator/views/design_views.py", line 109, in list
  20. backend_1 | qs = Clipart.objects.filter(Q(name="Apes") | Q(name="Dog")) # This line will show error
  21. backend_1 | File "/usr/local/lib/python3.7/site-packages/django/db/models/manager.py", line 85, in manager_method
  22. backend_1 | return getattr(self.get_queryset(), name)(*args, **kwargs)
  23. backend_1 | File "/usr/local/lib/python3.7/site-packages/safedelete/queryset.py", line 72, in filter
  24. backend_1 | return super(SafeDeleteQueryset, queryset).filter(*args, **kwargs)
  25. backend_1 | File "/usr/local/lib/python3.7/site-packages/django/db/models/query.py", line 941, in filter
  26. backend_1 | return self._filter_or_exclude(False, args, kwargs)
  27. backend_1 | File "/usr/local/lib/python3.7/site-packages/django/db/models/query.py", line 961, in _filter_or_exclude
  28. backend_1 | clone._filter_or_exclude_inplace(negate, args, kwargs)
  29. backend_1 | File "/usr/local/lib/python3.7/site-packages/django/db/models/query.py", line 968, in _filter_or_exclude_inplace
  30. backend_1 | self._query.add_q(Q(*args, **kwargs))
  31. backend_1 | File "/usr/local/lib/python3.7/site-packages/django/db/models/sql/query.py", line 1391, in add_q
  32. backend_1 | clause, _ = self._add_q(q_object, self.used_aliases)
  33. backend_1 | File "/usr/local/lib/python3.7/site-packages/django/db/models/sql/query.py", line 1413, in _add_q
  34. backend_1 | split_subq=split_subq, check_filterable=check_filterable,
  35. backend_1 | File "/usr/local/lib/python3.7/site-packages/django/db/models/sql/query.py", line 1281, in build_filter
  36. backend_1 | arg, value = filter_expr
  37. backend_1 | TypeError: cannot unpack non-iterable MatchAll object

答案1

得分: 0

你可能实现了错误的 Q,你应该这样导入它:

  1. from django.db.models import Q
  2. @permission_classes((AllowAny,))
  3. class ClipartViewSet(viewsets.GenericViewSet):
  4. serializer_class = ClipartSerializer
  5. queryset = Clipart.objects.filter(is_active=True).all()
  6. def list(self, request, **kwargs):
  7. qs = Clipart.objects.filter(Q(name='Apes') | Q(name='Dog'))
  8. return super(ClipartViewSet, self).list(self, request, **kwargs)

话虽如此,你可以使用 __in 查找&nbsp;<sup>[Django-doc]</sup> 来简化查询:

  1. @permission_classes((AllowAny,))
  2. class ClipartViewSet(viewsets.GenericViewSet):
  3. serializer_class = ClipartSerializer
  4. queryset = Clipart.objects.filter(is_active=True).all()
  5. def list(self, request, **kwargs):
  6. # 一些额外的逻辑
  7. qs = Clipart.objects.filter(name__in=('Apes', 'Dog'))
  8. print(qs)
  9. return super(ClipartViewSet, self).list(self, request, **kwargs)
英文:

Likely you implement the wrong Q, you import this with:

<pre><code>from <b>django.db.models</b> import Q

@permission_classes((AllowAny,))
class ClipartViewSet(viewsets.GenericViewSet):
serializer_class = ClipartSerializer
queryset = Clipart.objects.filter(is_active=True).all()

  1. def list(self, request, **kwargs):
  2. qs = Clipart.objects.filter(Q(name=&#39;Apes&#39;) | Q(name=&#39;Dog&#39;))
  3. return super(ClipartViewSet, self).list(self, request, **kwargs)&lt;/code&gt;&lt;/pre&gt;

that being said, you can simplify the query with an __in lookup&nbsp;<sup>[Django-doc]</sup>:

<pre><code>@permission_classes((AllowAny,))
class ClipartViewSet(viewsets.GenericViewSet):
serializer_class = ClipartSerializer
queryset = Clipart.objects.filter(is_active=True).all()

  1. def list(self, request, **kwargs):
  2. # Some extra logic
  3. qs = Clipart.objects.filter(&lt;b&gt;name__in=(&#39;Apes&#39;, &#39;Dog&#39;)&lt;/b&gt;)
  4. print(qs)
  5. return super(ClipartViewSet, self).list(self, request, **kwargs)&lt;/code&gt;&lt;/pre&gt;

huangapple
  • 本文由 发表于 2023年7月27日 20:45:04
  • 转载请务必保留本文链接:https://go.coder-hub.com/76779874.html
匿名

发表评论

匿名网友
#

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen:

确定