django - Django:'Q'对象不可迭代
问题描述
我有以下 APIView:
class SubmitFormAPIView(APIView):
def put(self, request, pk):
# some other codes
form = Form.objects.get(id=pk)
tu_filter, target_user = self._validate_target_user(request, form)
user_status, created = UserFormStatus.objects.get_or_create(
tu_filter,
form_id=pk,
user_id=request.user.pk
)
# Some other codes.
def _validate_target_user(request, form):
if some_conditions:
return Q(), None
else:
try:
target_user_id = int(request.GET.get('target_user_id))
except ValueError:
raise ValidationError()
target_user = get_user_model().objects.get(id=target_user_id)
return Q(target_user_id=target_user_id), target_user
但是当 django 想要执行get_or_create
方法时,会引发以下错误:
TypeError: 'Q' object is not iterable
注意:如果_validate_target_user()
返回Q(), None
,则不会引发错误并且视图工作正常。返回时将引发错误return Q(target_user_id=target_user_id), target_user
。
我知道,问题信息未完成,我只是想知道,可能导致此错误的原因是什么?
解决方案
从源头来看get_or_create(...)
,
这表明与or方法不同,def get_or_create(self, defaults=None, **kwargs):
get_or_create(...)
不接受任何参数。由于您正在执行如下函数,Python 认为是参数的值,预计它是一个可迭代的。get()
filter(...)
tu_filter
default
get_or_create(
tu_filter,
form_id=pk,
user_id=request.user.pk
)
推荐阅读
- ruby-on-rails - 如何仅在用户按搜索时呈现搜索结果
- android-recyclerview - RecyclerView:回收项目时绑定不正确
- python - 在 jedi-vim 中跨文件重构
- r - Ylim max 随变量动态变化,而 min 在 R 中设置为 0
- netsuite - 将 afterSubmit 脚本转换为 Worfkflow 动作脚本?
- r - 在 dplyr mutate 工作流程中引用和索引其他数据帧
- php - Laravel Ajax 请求,没有“Access-Control-Allow-Origin”标头
- javascript - 如何在 keydown 上启动计时器并在 keyup 上停止?
- memory-management - 如何在不初始化的情况下在 Windows 中分配 RAM 页面?
- reactjs - 组件之间的 React 过渡组动画(淡入组件代替另一个)