对于我的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时,不再可能将实例与查询集连接在一起。这意味着我必须查询同一项目两次,从而导致这种麻烦的方法:
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发布于 2019-02-28 18:02:33
该错误与访问项目ID无关。
空查询集和实例之间的|的结果是实例。因此,这意味着当您的权限存在时,您的user_projects变量将成为单个实例;随后,序列化程序会失败,因为它需要一个查询集。
您已经有了在单个查询中完成此操作的更好方法,但是如果您确实想要构建这样一个列表,那么更好的方法是累积ID,然后在最后的一个查询中获得它们;或者,简单地将实例附加到一个列表中。
https://stackoverflow.com/questions/54922243
复制相似问题