5
votes

I was trying to make an API using REST Framework for uploading a file to the server and my codes are below.

If you have any other easy method to do the same please post your code.

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()),

]

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/

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']

Traceback:

File "F:\proj\env\lib\site-packages\django\core\handlers\exception.py" in inner 41. 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)

File "F:\proj\env\lib\site-packages\django\core\handlers\base.py" in _get_response 185. 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)

File "F:\proj\env\lib\site-packages\rest_framework\viewsets.py" in view 90. return self.dispatch(request, *args, **kwargs)

File "F:\proj\env\lib\site-packages\rest_framework\views.py" in dispatch 489. 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)

File "F:\proj\env\lib\site-packages\rest_framework\views.py" in dispatch 486. 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())

Exception Type: TypeError at /upload/ Exception Value: get_queryset() missing 1 required positional argument: 'request'

Updated views.py file as follows

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/

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']

Traceback:

File "F:\proj\env\lib\site-packages\django\core\handlers\exception.py" in inner 41. 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)

File "F:\proj\env\lib\site-packages\django\core\handlers\base.py" in _get_response 185. 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)

File "F:\proj\env\lib\site-packages\rest_framework\viewsets.py" in view 90. return self.dispatch(request, *args, **kwargs)

File "F:\proj\env\lib\site-packages\rest_framework\views.py" in dispatch 489. 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)

File "F:\proj\env\lib\site-packages\rest_framework\views.py" in dispatch 486. 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())

File "F:\proj\env\myproject\webapp\views.py" in get_queryset 74. 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


New Traceback after changeing get query set

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/

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']

Traceback:

File "F:\proj\env\lib\site-packages\django\core\handlers\exception.py" in inner 41. 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)

File "F:\proj\env\lib\site-packages\django\core\handlers\base.py" in _get_response 185. 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)

File "F:\proj\env\lib\site-packages\rest_framework\viewsets.py" in view 90. return self.dispatch(request, *args, **kwargs)

File "F:\proj\env\lib\site-packages\rest_framework\views.py" in dispatch 489. 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)

File "F:\proj\env\lib\site-packages\rest_framework\views.py" in dispatch 486. 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())

File "F:\proj\env\myproject\webapp\views.py" in get_queryset 74. qs = super(FileUploaderViewSet, self).get_queryset()

File "F:\proj\env\lib\site-packages\rest_framework\generics.py" in get_queryset 68. % self.class.name

Exception Type: AssertionError at /upload/ Exception Value: 'FileUploaderViewSet' should either include a queryset attribute, or override the get_queryset() method.

4
Did you try adding a model field in your view as per my updated question? Where are you stuck now?Kishor Pawar
Thankyou..actually i forget to import the model , and that made all the troubles... the issue with the file upload is fixed,now can you help me to extract the name of the file that is uploaded using validated_dataFortuneCookie
See if this article helps you. medium.com/@jxstanford/…Kishor Pawar

4 Answers

1
votes

As Sayse said, it only requires self. but you don't have to pass self to get_queryset(). self is just an instance, super itself is self-instance.

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?

Did you try just writing queryset = Model.objects.all()?

I do not see model = ModelName in your view.

view class should have following fields.

def get_queryset(self):
    return queryset

serializer_class = SerializerClass
model = ModelName
0
votes

get_queryset only requires self as a parameter.

Simply remove the other args.

0
votes

get_queryset does not expect the request parameter, and it will not be passed by the DRF base class. 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.

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

The get_queryset() does not expect a 'request'. Maybe remove the 'request' argument from the get_queryset(). For reference you can check: 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