首页 > 解决方案 > 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

我知道,问题信息未完成,我只是想知道,可能导致此错误的原因是什么?

标签: djangodjango-modelsdjango-ormdjango-q

解决方案


从源头来看get_or_create(...)

def get_or_create(self, defaults=None, **kwargs):
这表明与or方法不同,get_or_create(...)不接受任何参数。由于您正在执行如下函数,Python 认为是参数的值,预计它是一个可迭代的。get()filter(...)tu_filterdefault

get_or_create(
            tu_filter,
            form_id=pk,
            user_id=request.user.pk
        )

推荐阅读