简体   繁体   English

Django - get_queryset()缺少1个必需的位置参数:'request'

[英]Django - get_queryset() missing 1 required positional argument: 'request'

I was trying to make an API using REST Framework for uploading a file to the server and my codes are below. 我试图使用REST Framework创建一个API,将文件上传到服务器,我的代码如下。

If you have any other easy method to do the same please post your code. 如果您有任何其他简单的方法来做同样的事情,请发布您的代码。

models.py 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 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 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 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()),

]

My requirement is that i need to upload a file to the server and the details of the uploaded file is to be shown. 我的要求是我需要将文件上传到服务器,并显示上传文件的详细信息。

This is the error i am getting! 这是我得到的错误!

Environment: 环境:

Request Method: GET Request URL: http://127.0.0.1:8000/upload/ 请求方法:GET请求URL: http//127.0.0.18000 / upload /

Django Version: 1.11.7 Python Version: 3.6.3 Installed Applications: ['django.contrib.admin', 'django.contrib.auth', 'django.contrib.contenttypes', 'django.contrib.sessions', 'django.contrib.messages', 'django.contrib.staticfiles', 'rest_framework', 'webapp'] 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'] 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 “]

Traceback: 追溯:

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

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

File "F:\\proj\\env\\lib\\site-packages\\django\\core\\handlers\\base.py" in _get_response 185. response = wrapped_callback(request, *callback_args, **callback_kwargs) _get_response 185中的文件“F:\\ proj \\ env \\ lib \\ site-packages \\ django \\ core \\ handlers \\ base.py”。response = wrapped_callback(request,* callback_args,** callback_kwargs)

File "F:\\proj\\env\\lib\\site-packages\\django\\views\\decorators\\csrf.py" in wrapped_view 58. return view_func(*args, **kwargs) 在wrapped_view 58中输入文件“F:\\ proj \\ env \\ lib \\ site-packages \\ django \\ views \\ decorators \\ csrf.py”。返回view_func(* args,** kwargs)

File "F:\\proj\\env\\lib\\site-packages\\rest_framework\\viewsets.py" in view 90. return self.dispatch(request, *args, **kwargs) 在视图90中输入文件“F:\\ proj \\ env \\ lib \\ site-packages \\ rest_framework \\ viewsets.py”。返回self.dispatch(request,* args,** kwargs)

File "F:\\proj\\env\\lib\\site-packages\\rest_framework\\views.py" in dispatch 489. response = self.handle_exception(exc) 在调度489中的文件“F:\\ proj \\ env \\ lib \\ site-packages \\ rest_framework \\ views.py”.response = self.handle_exception(exc)

File "F:\\proj\\env\\lib\\site-packages\\rest_framework\\views.py" in handle_exception 449. self.raise_uncaught_exception(exc) handle_exception 449中的文件“F:\\ proj \\ env \\ lib \\ site-packages \\ rest_framework \\ _ views.py”self.raise_uncaught_exception(exc)

File "F:\\proj\\env\\lib\\site-packages\\rest_framework\\views.py" in dispatch 486. response = handler(request, *args, **kwargs) 在调度486中的文件“F:\\ proj \\ env \\ lib \\ site-packages \\ rest_framework \\ views.py”.response = handler(request,* args,** kwargs)

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

Exception Type: TypeError at /upload/ Exception Value: get_queryset() missing 1 required positional argument: 'request' 异常类型:TypeError at / upload / Exception值:get_queryset()缺少1个必需的位置参数:'request'

Updated views.py file as follows 更新了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

Traceback: 追溯:

Environment: 环境:

Request Method: GET Request URL: http://127.0.0.1:8000/upload/ 请求方法:GET请求URL: http//127.0.0.18000 / upload /

Django Version: 1.11.7 Python Version: 3.6.3 Installed Applications: ['django.contrib.admin', 'django.contrib.auth', 'django.contrib.contenttypes', 'django.contrib.sessions', 'django.contrib.messages', 'django.contrib.staticfiles', 'rest_framework', 'webapp'] 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'] 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 “]

Traceback: 追溯:

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

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

File "F:\\proj\\env\\lib\\site-packages\\django\\core\\handlers\\base.py" in _get_response 185. response = wrapped_callback(request, *callback_args, **callback_kwargs) _get_response 185中的文件“F:\\ proj \\ env \\ lib \\ site-packages \\ django \\ core \\ handlers \\ base.py”。response = wrapped_callback(request,* callback_args,** callback_kwargs)

File "F:\\proj\\env\\lib\\site-packages\\django\\views\\decorators\\csrf.py" in wrapped_view 58. return view_func(*args, **kwargs) 在wrapped_view 58中输入文件“F:\\ proj \\ env \\ lib \\ site-packages \\ django \\ views \\ decorators \\ csrf.py”。返回view_func(* args,** kwargs)

File "F:\\proj\\env\\lib\\site-packages\\rest_framework\\viewsets.py" in view 90. return self.dispatch(request, *args, **kwargs) 在视图90中输入文件“F:\\ proj \\ env \\ lib \\ site-packages \\ rest_framework \\ viewsets.py”。返回self.dispatch(request,* args,** kwargs)

File "F:\\proj\\env\\lib\\site-packages\\rest_framework\\views.py" in dispatch 489. response = self.handle_exception(exc) 在调度489中的文件“F:\\ proj \\ env \\ lib \\ site-packages \\ rest_framework \\ views.py”.response = self.handle_exception(exc)

File "F:\\proj\\env\\lib\\site-packages\\rest_framework\\views.py" in handle_exception 449. self.raise_uncaught_exception(exc) handle_exception 449中的文件“F:\\ proj \\ env \\ lib \\ site-packages \\ rest_framework \\ _ views.py”self.raise_uncaught_exception(exc)

File "F:\\proj\\env\\lib\\site-packages\\rest_framework\\views.py" in dispatch 486. response = handler(request, *args, **kwargs) 在调度486中的文件“F:\\ proj \\ env \\ lib \\ site-packages \\ rest_framework \\ views.py”.response = handler(request,* args,** kwargs)

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

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

Exception Type: TypeError at /upload/ Exception Value: get_queryset() takes 1 positional argument but 2 were given 异常类型:TypeError at / upload / Exception值:get_queryset()占用1个位置参数,但给出了2个


New Traceback after changeing get query set 更改获取查询集后的新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

Environment: 环境:

Request Method: GET Request URL: http://127.0.0.1:8000/upload/ 请求方法:GET请求URL: http//127.0.0.18000 / upload /

Django Version: 1.11.7 Python Version: 3.6.3 Installed Applications: ['django.contrib.admin', 'django.contrib.auth', 'django.contrib.contenttypes', 'django.contrib.sessions', 'django.contrib.messages', 'django.contrib.staticfiles', 'rest_framework', 'webapp'] 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'] 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 “]

Traceback: 追溯:

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

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

File "F:\\proj\\env\\lib\\site-packages\\django\\core\\handlers\\base.py" in _get_response 185. response = wrapped_callback(request, *callback_args, **callback_kwargs) _get_response 185中的文件“F:\\ proj \\ env \\ lib \\ site-packages \\ django \\ core \\ handlers \\ base.py”。response = wrapped_callback(request,* callback_args,** callback_kwargs)

File "F:\\proj\\env\\lib\\site-packages\\django\\views\\decorators\\csrf.py" in wrapped_view 58. return view_func(*args, **kwargs) 在wrapped_view 58中输入文件“F:\\ proj \\ env \\ lib \\ site-packages \\ django \\ views \\ decorators \\ csrf.py”。返回view_func(* args,** kwargs)

File "F:\\proj\\env\\lib\\site-packages\\rest_framework\\viewsets.py" in view 90. return self.dispatch(request, *args, **kwargs) 在视图90中输入文件“F:\\ proj \\ env \\ lib \\ site-packages \\ rest_framework \\ viewsets.py”。返回self.dispatch(request,* args,** kwargs)

File "F:\\proj\\env\\lib\\site-packages\\rest_framework\\views.py" in dispatch 489. response = self.handle_exception(exc) 在调度489中的文件“F:\\ proj \\ env \\ lib \\ site-packages \\ rest_framework \\ views.py”.response = self.handle_exception(exc)

File "F:\\proj\\env\\lib\\site-packages\\rest_framework\\views.py" in handle_exception 449. self.raise_uncaught_exception(exc) handle_exception 449中的文件“F:\\ proj \\ env \\ lib \\ site-packages \\ rest_framework \\ _ views.py”self.raise_uncaught_exception(exc)

File "F:\\proj\\env\\lib\\site-packages\\rest_framework\\views.py" in dispatch 486. response = handler(request, *args, **kwargs) 在调度486中的文件“F:\\ proj \\ env \\ lib \\ site-packages \\ rest_framework \\ views.py”.response = handler(request,* args,** kwargs)

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

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

File "F:\\proj\\env\\lib\\site-packages\\rest_framework\\generics.py" in get_queryset 68. % self. 在get_queryset 68中输入文件“F:\\ proj \\ env \\ lib \\ site-packages \\ rest_framework \\ generics.py”。%self。 class . 上课 name 名称

Exception Type: AssertionError at /upload/ Exception Value: 'FileUploaderViewSet' should either include a queryset attribute, or override the get_queryset() method. 异常类型:AssertionError at / upload / Exception值:'FileUploaderViewSet'应包含queryset属性,或覆盖get_queryset()方法。

The get_queryset() does not expect a 'request'. get_queryset()不期望'request'。 Maybe remove the 'request' argument from the get_queryset(). 也许从get_queryset()中删除'request'参数。 For reference you can check: get_queryset() 作为参考,您可以检查: get_queryset()

Maybe something like this: 也许是这样的:

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

As Sayse said, it only requires self . 正如Sayse所说,它只需要self but you don't have to pass self to get_queryset() . 但你不必将self传递给get_queryset() self is just an instance, super itself is self-instance. self只是一个实例, super本身就是自我实例。

So just change your following line from 所以只需更改以下行

super(FileUploaderViewSet, self).get_queryset(self, *args, **kwargs)

to

super(FileUploaderViewSet, self).get_queryset()

look at the code snippet here 看一下这里的代码片段

Update: 更新:

Are you sure, your get_queryset is in the same class? 你确定,你的get_queryset在同一个类中吗?

Did you try just writing queryset = Model.objects.all() ? 您是否尝试过编写queryset = Model.objects.all()

I do not see model = ModelName in your view. 我在您的视图中看不到model = ModelName

view class should have following fields. view class应该有以下字段。

def get_queryset(self):
    return queryset

serializer_class = SerializerClass
model = ModelName

get_queryset only requires self as a parameter. get_queryset只需要self作为参数。

Simply remove the other args. 只需删除其他args。

get_queryset does not expect the request parameter, and it will not be passed by the DRF base class. get_queryset不期望请求参数,并且它不会被DRF基类传递。 It is however available as an instance attribute. 但它可用作实例属性。 You should remove it from the method signature and the super call, and access it via self.request . 您应该从方法签名和超级调用中删除它,并通过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

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM