簡體   English   中英

Django:無法迭代並訪問簡單的查詢集

[英]Django: can't iterate over and access a simple queryset

對於我的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

該錯誤與訪問項目ID無關。

|的結果 在空查詢集和實例之間的是實例。 因此,這意味着當您的權限存在時,您的user_projects變量將成為一個實例; 然后,隨后的序列化程序由於期望查詢集而失敗。

您已經有一個更好的方法可以在單個查詢中執行此操作,但是如果您確實想要建立這樣的列表,則可以作為參考,更好的方法是累積ID,然后在一次查詢中將它們全部獲取; 或者,只需將實例附加到列表中。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM