Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/django/22.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python Django:can';t迭代并访问一个简单的查询集_Python_Django - Fatal编程技术网

Python Django:can';t迭代并访问一个简单的查询集

Python Django:can';t迭代并访问一个简单的查询集,python,django,Python,Django,对于我的API,我必须找出用户可以访问哪些项目,然后返回它们。我试着这样做: def get_queryset(self): user = self.request.user allow_all = user.is_superuser or user.is_staff or settings.API_UNSAFE if self.action == 'list' and not allow_all: projects = Project.objects.a

对于我的API,我必须找出用户可以访问哪些项目,然后返回它们。我试着这样做:

def get_queryset(self):
    user = self.request.user
    allow_all = user.is_superuser or user.is_staff or settings.API_UNSAFE
    if self.action == 'list' and not allow_all:
        projects = Project.objects.all()
        user_projects = Project.objects.none()
        for project in projects:
            permission = Permission.objects.filter(user=user.user, table_name='Project', fk=project.id)
            if permission.count() > 0:
                user_projects = user_projects | project
        return user_projects
    return Project.objects.all()
其结果是:

'Project' object is not iterable
因此我使用了
values()
而不是
all()
。但是,当您使用
.values
时,就不可能再使用queryset来连接实例了。这意味着我必须对同一个项目进行两次查询,从而产生了这种黑客方法:

projects = Project.objects.values()
user_projects = Project.objects.none()
for project in projects:
    permission = Permission.objects.filter(user=user.user, table_name='Project', fk=project['id'])
    if permission.count() > 0:
        # Wanted to use .get() here, but that threw the same error
        user_project = Project.objects.filter(id=project['id']) 
        user_projects |= user_project
return user_projects
当然还有更好的办法,我做错了什么

堆栈跟踪:

Environment:


Request Method: GET
Request URL: http://localhost:8000/api/projects/

Django Version: 2.0.6
Python Version: 3.7.0
Installed Applications:
['apps.api',
 'rest_framework',
 'apps.dashboard',
 'apps.login',
 'apps.base',
 'sass_processor',
 'django.contrib.admin',
 'django.contrib.auth',
 'django.contrib.contenttypes',
 'django.contrib.sessions',
 'django.contrib.messages',
 'django.contrib.staticfiles',
 'django_seed',
 'rest_framework.authtoken']
Installed Middleware:
['django.middleware.security.SecurityMiddleware',
 'django.contrib.sessions.middleware.SessionMiddleware',
 'django.middleware.common.CommonMiddleware',
 'django.middleware.csrf.CsrfViewMiddleware',
 'django.contrib.auth.middleware.AuthenticationMiddleware',
 'django.contrib.messages.middleware.MessageMiddleware',
 'django.middleware.clickjacking.XFrameOptionsMiddleware']



Traceback:

File "/Users/Ruben/Documents/Projects/BIM_Github/bim-data-manager/venv/lib/python3.7/site-packages/django/core/handlers/exception.py" in inner
  35.             response = get_response(request)

File "/Users/Ruben/Documents/Projects/BIM_Github/bim-data-manager/venv/lib/python3.7/site-packages/django/core/handlers/base.py" in _get_response
  128.                 response = self.process_exception_by_middleware(e, request)

File "/Users/Ruben/Documents/Projects/BIM_Github/bim-data-manager/venv/lib/python3.7/site-packages/django/core/handlers/base.py" in _get_response
  126.                 response = wrapped_callback(request, *callback_args, **callback_kwargs)

File "/Users/Ruben/Documents/Projects/BIM_Github/bim-data-manager/venv/lib/python3.7/site-packages/django/views/decorators/csrf.py" in wrapped_view
  54.         return view_func(*args, **kwargs)

File "/Users/Ruben/Documents/Projects/BIM_Github/bim-data-manager/venv/lib/python3.7/site-packages/rest_framework/viewsets.py" in view
  95.             return self.dispatch(request, *args, **kwargs)

File "/Users/Ruben/Documents/Projects/BIM_Github/bim-data-manager/venv/lib/python3.7/site-packages/rest_framework/views.py" in dispatch
  494.             response = self.handle_exception(exc)

File "/Users/Ruben/Documents/Projects/BIM_Github/bim-data-manager/venv/lib/python3.7/site-packages/rest_framework/views.py" in handle_exception
  454.             self.raise_uncaught_exception(exc)

File "/Users/Ruben/Documents/Projects/BIM_Github/bim-data-manager/venv/lib/python3.7/site-packages/rest_framework/views.py" in dispatch
  491.             response = handler(request, *args, **kwargs)

File "/Users/Ruben/Documents/Projects/BIM_Github/bim-data-manager/venv/lib/python3.7/site-packages/rest_framework/mixins.py" in list
  48.         return Response(serializer.data)

File "/Users/Ruben/Documents/Projects/BIM_Github/bim-data-manager/venv/lib/python3.7/site-packages/rest_framework/serializers.py" in data
  742.         ret = super(ListSerializer, self).data

File "/Users/Ruben/Documents/Projects/BIM_Github/bim-data-manager/venv/lib/python3.7/site-packages/rest_framework/serializers.py" in data
  262.                 self._data = self.to_representation(self.instance)

File "/Users/Ruben/Documents/Projects/BIM_Github/bim-data-manager/venv/lib/python3.7/site-packages/rest_framework/serializers.py" in to_representation
  660.             self.child.to_representation(item) for item in iterable

Exception Type: TypeError at /api/projects/
Exception Value: 'Project' object is not iterable

该错误与访问项目ID完全无关

空查询集和实例之间的
|
结果就是实例。这意味着当您的权限存在时,您的
user\u projects
变量将成为单个实例;随后,序列化程序失败,因为它需要查询集


在单个查询中已经有了更好的方法,但是作为参考,如果您确实想建立这样的列表,更好的方法是累积ID,然后在最后的一个查询中获得所有ID;或者,只需将实例附加到列表中。

该错误与访问项目ID无关

空查询集和实例之间的
|
结果就是实例。这意味着当您的权限存在时,您的
user\u projects
变量将成为单个实例;随后,序列化程序失败,因为它需要查询集


在单个查询中已经有了更好的方法,但是作为参考,如果您确实想建立这样的列表,更好的方法是累积ID,然后在最后的一个查询中获得所有ID;或者,只需将实例附加到列表。

哪一行抛出此错误?此外,您应该能够将查询更改为
user\u projects=projects.objects.filter(id\u in=Permission.objects.filter(user=user,table\u name=“Project”).values(“fk”)
并跳过循环引发错误的行是:
Permission=Permission.objects.filter(user=user.user,table\u name='Project',fk=Project.id)
它不喜欢我访问项目的id您的查询工作正常,并且完全不需要循环。所以谢谢。仍然想知道为什么上面的代码不能像我预期的那样工作。有一件事让我想知道的是,为什么您要查询
用户。用户
,而不仅仅是
用户
,但仍然没有出现错误与之相关。
project['id']
是否有值?我会尝试
project.id
哪行抛出此错误?此外,您应该能够将查询更改为
user\u projects=projects.objects.filter(id\u in=Permission.objects.filter(user=user,table\u name=“project”).values(“fk”)
并跳过循环引发错误的行是:
permission=permission.objects.filter(user=user.user,table_name='Project',fk=Project.id)
它不喜欢我访问项目的id您的查询工作正常,并且完全不需要循环。所以谢谢。仍然想知道为什么上面的代码不能像我预期的那样工作。有一件事让我想知道的是,为什么您要查询
用户。用户
,而不仅仅是
用户
,但仍然没有出现错误与之相关。
project['id']
有价值吗?我会试试
project.id