Django - get_queryset() 缺少 1 个必需的位置参数:“请求”

Posted

技术标签:

【中文标题】Django - get_queryset() 缺少 1 个必需的位置参数:“请求”【英文标题】:Django - get_queryset() missing 1 required positional argument: 'request' 【发布时间】:2018-05-10 14:35:34 【问题描述】:

我正在尝试使用 REST Framework 制作一个 API,用于将文件上传到服务器,我的代码如下。

如果您有任何其他简单的方法可以做到这一点,请发布您的代码。

models.py

from django.db import models

# Create your models here.

class FileUploader(models.Model):
    file = models.FileField()
    name = models.CharField(max_length=100) #name is filename without extension
    version = models.IntegerField(default=0)
    upload_date = models.DateTimeField(auto_now=True, db_index=True)
    owner = models.ForeignKey('auth.User', related_name='uploaded_files')
    size = models.IntegerField(default=0)

    def __str__(self):
        return self.name

serializers.py

class FileUploaderSerializer(serializers.ModelSerializer):
    class Meta:
        model=FileUploader
        fields='__all__'
        read_only_fields = '__all__'
    def validate(self, validated_data):
        validated_data['owner'] = self.context['request'].user
        validated_data['name'] = os.path.splitext(validated_data['file'].name)[0]
        validated_data['size'] = validated_data['file'].size
        return validated_data
    def create(self,validated_data):
        return FileUploader.objects.create(**validated_data)

views.py

class FileUploaderViewSet(viewsets.ModelViewSet):
    serializer_class = FileUploaderSerializer
    parser_classes=(MultiPartParser,FormParser)
    def get_queryset(self,request, *args, **kwargs):
        qs = super(FileUploaderViewSet, self).get_queryset(self,request, *args, **kwargs)
        qs = qs.filter(owner=self.request.user)
        return qs

urls.py

from django.conf.urls import url
from django.conf.urls import url,include
from django.contrib import admin
from rest_framework import routers
from rest_framework.authtoken.views import obtain_auth_token
from rest_framework.urlpatterns import format_suffix_patterns
from webapp import views
from webapp.views import(
    UserCreateAPIView,
    UserLoginAPIView,
    FileUploaderViewSet,
    )

router = routers.DefaultRouter()
router.register(r'upload', views.FileUploaderViewSet,base_name='file-view')

urlpatterns = [
    url(r'^admin/', admin.site.urls),
    url(r'^', include(router.urls)),
    #url(r'^upload/$',FileUploaderViewSet.as_view()),

]

我的要求是我需要上传一个文件到服务器并显示上传文件的详细信息。

这是我遇到的错误!

环境:

请求方法:GET 请求地址:http://127.0.0.1:8000/upload/

Django 版本:1.11.7 Python 版本:3.6.3 已安装的应用程序: ['django.contrib.admin', 'django.contrib.auth', 'django.contrib.contenttypes', 'django.contrib.sessions', 'django.contrib.messages', 'django.contrib.staticfiles', 'rest_framework', 'webapp'] 已安装的中间件: ['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']

追溯:

文件“F:\proj\env\lib\site-packages\django\core\handlers\exception.py” 在内部 41. response = get_response(request)

文件“F:\proj\env\lib\site-packages\django\core\handlers\base.py”在 _get_response 187. response = self.process_exception_by_middleware(e, request)

文件“F:\proj\env\lib\site-packages\django\core\handlers\base.py”在 _get_response 185. response = Wrapped_callback(request, *callback_args, **callback_kwargs)

文件 "F:\proj\env\lib\site-packages\django\views\decorators\csrf.py" 在wrapped_view 58. return view_func(*args, **kwargs)

文件“F:\proj\env\lib\site-packages\rest_framework\viewsets.py”在 看法 90. return self.dispatch(request, *args, **kwargs)

文件“F:\proj\env\lib\site-packages\rest_framework\views.py”在 派遣 489. 响应 = self.handle_exception(exc)

文件“F:\proj\env\lib\site-packages\rest_framework\views.py”在 处理异常 449. self.raise_uncaught_exception(exc)

文件“F:\proj\env\lib\site-packages\rest_framework\views.py”在 派遣 486. 响应 = 处理程序(请求,*args,**kwargs)

列表中的文件“F:\proj\env\lib\site-packages\rest_framework\mixins.py” 40. queryset = self.filter_queryset(self.get_queryset())

异常类型:/upload/ 处的 TypeError 异常值:get_queryset() 缺少 1 个必需的位置参数:“请求”

更新views.py文件如下

from django.shortcuts import render
from django.db.models import Q
from django.http import HttpResponse
from django.shortcuts import get_object_or_404
from rest_framework.views import APIView
from rest_framework.response import Response
from rest_framework import status
from rest_framework.parsers import MultiPartParser, FormParser

from rest_framework import viewsets
from rest_framework.status import HTTP_200_OK,HTTP_400_BAD_REQUEST
from .models import employees
from .serializers import (
    employeesSerializer,
    FileUploaderSerializer,
    )
from django.contrib.auth import get_user_model
from rest_framework.generics import (
    CreateAPIView,
    DestroyAPIView,
    ListAPIView,
    RetrieveAPIView,
    RetrieveUpdateAPIView,
    )

from rest_framework.permissions import(
    AllowAny,
    IsAuthenticated,
    IsAdminUser,
    IsAuthenticatedOrReadOnly,
    )

class employeeList(APIView):
    def get(self,request):
        employees1=employees.objects.all()
        serializer=employeesSerializer(employees1,many=True)
        return Response(serializer.data)


    def post(self):
        pass

User=get_user_model()

from .serializers import(
    UserCreateSerializer,
    UserLoginSerializer,
    )

class UserCreateAPIView(CreateAPIView):
    serializer_class=UserCreateSerializer
    queryset=User.objects.all()


class UserLoginAPIView(APIView):
    permission_classes=[AllowAny]
    serializer_class=UserLoginSerializer
    def post(self,request,*args,**kwargs):
        data=request.data
        serializer=UserLoginSerializer(data=data)
        if serializer.is_valid(raise_exception=True):
            new_data=serializer.data
            return Response(new_data,status=HTTP_200_OK)
        return Response(serializer.errors,status=HTTP_400_BAD_REQUEST)

class FileUploaderViewSet(viewsets.ModelViewSet):
    serializer_class = FileUploaderSerializer
    parser_classes=(MultiPartParser,FormParser)

 # overriding default query set
    #queryset = LayerFile.objects.all()

    def get_queryset(self, *args, **kwargs):
        qs = super(FileUploaderViewSet, self).get_queryset(self, *args, **kwargs)
        qs = qs.filter(owner=self.request.user)
        return qs

追溯:

环境:

请求方法:GET 请求地址:http://127.0.0.1:8000/upload/

Django 版本:1.11.7 Python 版本:3.6.3 已安装的应用程序: ['django.contrib.admin', 'django.contrib.auth', 'django.contrib.contenttypes', 'django.contrib.sessions', 'django.contrib.messages', 'django.contrib.staticfiles', 'rest_framework', 'webapp'] 已安装的中间件: ['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']

追溯:

文件“F:\proj\env\lib\site-packages\django\core\handlers\exception.py” 在内部 41. response = get_response(request)

文件“F:\proj\env\lib\site-packages\django\core\handlers\base.py”在 _get_response 187. response = self.process_exception_by_middleware(e, request)

文件“F:\proj\env\lib\site-packages\django\core\handlers\base.py”在 _get_response 185. response = Wrapped_callback(request, *callback_args, **callback_kwargs)

文件 "F:\proj\env\lib\site-packages\django\views\decorators\csrf.py" 在wrapped_view 58. return view_func(*args, **kwargs)

文件“F:\proj\env\lib\site-packages\rest_framework\viewsets.py”在 看法 90. return self.dispatch(request, *args, **kwargs)

文件“F:\proj\env\lib\site-packages\rest_framework\views.py”在 派遣 489. 响应 = self.handle_exception(exc)

文件“F:\proj\env\lib\site-packages\rest_framework\views.py”在 处理异常 449. self.raise_uncaught_exception(exc)

文件“F:\proj\env\lib\site-packages\rest_framework\views.py”在 派遣 486. 响应 = 处理程序(请求,*args,**kwargs)

列表中的文件“F:\proj\env\lib\site-packages\rest_framework\mixins.py” 40. queryset = self.filter_queryset(self.get_queryset())

get_queryset 中的文件“F:\proj\env\myproject\webapp\views.py” 74. qs = super(FileUploaderViewSet, self).get_queryset(self, *args, **kwargs)

异常类型:/upload/ 处的 TypeError 异常值:get_queryset() 接受 1 个位置参数,但给出了 2 个


更改获取查询集后的新 Traceback

class FileUploaderViewSet(viewsets.ModelViewSet):
    serializer_class = FileUploaderSerializer
    parser_classes=(MultiPartParser,FormParser)

 # overriding default query set

    def get_queryset(self):
        qs = super(FileUploaderViewSet, self).get_queryset()
        qs = qs.filter(owner=self.request.user)
        return qs

环境:

请求方法:GET 请求地址:http://127.0.0.1:8000/upload/

Django 版本:1.11.7 Python 版本:3.6.3 已安装的应用程序: ['django.contrib.admin', 'django.contrib.auth', 'django.contrib.contenttypes', 'django.contrib.sessions', 'django.contrib.messages', 'django.contrib.staticfiles', 'rest_framework', 'webapp'] 已安装的中间件: ['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']

追溯:

文件“F:\proj\env\lib\site-packages\django\core\handlers\exception.py” 在内部 41. response = get_response(request)

文件“F:\proj\env\lib\site-packages\django\core\handlers\base.py”在 _get_response 187. response = self.process_exception_by_middleware(e, request)

文件“F:\proj\env\lib\site-packages\django\core\handlers\base.py”在 _get_response 185. response = Wrapped_callback(request, *callback_args, **callback_kwargs)

文件 "F:\proj\env\lib\site-packages\django\views\decorators\csrf.py" 在wrapped_view 58. return view_func(*args, **kwargs)

文件“F:\proj\env\lib\site-packages\rest_framework\viewsets.py”在 看法 90. return self.dispatch(request, *args, **kwargs)

文件“F:\proj\env\lib\site-packages\rest_framework\views.py”在 派遣 489. 响应 = self.handle_exception(exc)

文件“F:\proj\env\lib\site-packages\rest_framework\views.py”在 处理异常 449. self.raise_uncaught_exception(exc)

文件“F:\proj\env\lib\site-packages\rest_framework\views.py”在 派遣 486. 响应 = 处理程序(请求,*args,**kwargs)

列表中的文件“F:\proj\env\lib\site-packages\rest_framework\mixins.py” 40. queryset = self.filter_queryset(self.get_queryset())

get_queryset 中的文件“F:\proj\env\myproject\webapp\views.py” 74. qs = super(FileUploaderViewSet, self).get_queryset()

文件“F:\proj\env\lib\site-packages\rest_framework\generics.py”在 获取查询集 68. % self.class.name

异常类型:/upload/ 处的 AssertionError 异常值: 'FileUploaderViewSet' 应该包含 queryset 属性,或者 覆盖get_queryset() 方法。

【问题讨论】:

您是否尝试按照我更新的问题在视图中添加模型字段?你现在卡在哪里了? Thankyou..其实我忘记导入模型了,这造成了所有的麻烦......文件上传的问题已经解决,现在你能帮我提取文件的名称吗使用validated_data上传 看看这篇文章对你有没有帮助。 medium.com/@jxstanford/… 【参考方案1】:

正如 Sayse 所说,它只需要 self。但您不必将self 传递给get_queryset()self 只是一个实例,super 本身就是自实例。

所以只需从

更改您的以下行
super(FileUploaderViewSet, self).get_queryset(self, *args, **kwargs)

super(FileUploaderViewSet, self).get_queryset()

look at the code snippet here

更新:

您确定您的get_queryset 在同一个班级吗?

你试过写queryset = Model.objects.all()吗?

我没有在您的视图中看到model = ModelName

view class 应该有以下字段。

def get_queryset(self):
    return queryset

serializer_class = SerializerClass
model = ModelName

【讨论】:

没有回溯,帮不上忙 异常类型:AssertionError 异常值:“FileUploaderViewSet”应该包含queryset 属性,或者覆盖get_queryset() 方法。 def get_queryset(self, *args, **kwargs): 更改为def get_queryset(self): 最后添加了新的回溯和代码!请检查 更新答案。【参考方案2】:

get_queryset 只需要self 作为参数。

只需删除其他参数。

【讨论】:

尝试删除其他标签,但没有显示任何错误变化! @AravindMNair - 您没有删除对super.get_queryset 的调用中的参数。【参考方案3】:

get_queryset不期望请求参数,不会被DRF基类传递。但是,它可以作为实例属性使用。您应该从方法签名和超级调用中删除它,并通过self.request 访问它。

def get_queryset(self, *args, **kwargs):
    qs = super(FileUploaderViewSet, self).get_queryset(*args, **kwargs)
    qs = qs.filter(owner=self.request.user)
    return qs

【讨论】:

试过了,但它对我不起作用..仍然是同样的错误! @DanielRoseman 我认为我们在 super() 调用 get_queryset() 中不需要“自我”。 '' 对象没有属性 'request' - 是我在这里得到的错误消息【参考方案4】:

get_queryset() 不期望“请求”。也许从 get_queryset() 中删除“请求”参数。作为参考,您可以检查: get_queryset()

可能是这样的:

def get_queryset(self, *args, **kwargs):
    qs = your_model.objects.all()
    qs = qs.filter(owner=self.request.user)
    return qs

【讨论】:

删除请求参数后你得到同样的错误?您确定您从 super() 调用以及 get_queryset() 参数中删除了“请求”?也许您可以发布更新的代码?已经编辑了我的答案,也许是这样的。 看到了。我认为你还没有从超级电话中删除“自我”,我认为你需要删除它。也许尝试粘贴上面的代码 sn-p,让我知道你的进度。 最后添加了新的回溯和get_queryset代码sn-p。请检查。 你确定get_queryset()是放在FileUploaderViewSet里面的吗?它是否正确缩进?请确认。 [链接] (i.imgur.com/ECtn7ab.png) 请检查此链接。附上代码片段截图。

以上是关于Django - get_queryset() 缺少 1 个必需的位置参数:“请求”的主要内容,如果未能解决你的问题,请参考以下文章

使用 get_queryset 的 Django ListView 分页

如何从 Django 中的 get_queryset 方法返回多个查询集对象或添加查询集结果

Django get_object ,get_queryset方法

Django ReadOnlyModelViewSet:get_querySet 被 pk 过滤

get_queryset中的Django 2.0 url参数

Django - get_queryset() 缺少 1 个必需的位置参数:“请求”