Django Rest Framework将文件上传到一个方法 [英] Django Rest Framework upload file to a method

查看:2996
本文介绍了Django Rest Framework将文件上传到一个方法的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

所以我一直在尝试使用DRF将文件上传到一个没有运气的方法。



我可以上传到$ code > ModelViewSet 使用(FormParser,MultiPartParser,)没有问题,但我真的需要使用它这样的东西 http:// localhost:8000 / api / v1 / women / {pk} / upload_avatar / 其中我想先通过id过滤女人,并上传到她的头像(这是一个外键多媒体模型)。我尝试使用一个嵌套的资源库,没有运气。



到目前为止,我在我的模型视图中:

  class WomenNativePassportViewSet(viewsets.ModelViewSet):
queryset = Women.objects.all()
serializer_class = WomenNativePassportSerializer
authentication_classes =(NoAuthentication,)


@detail_route(
methods = ['post','put','补丁','获取)
parser_classes =(FormParser,MultiPartParser) '],permission_classes = [AllowAny],
authentication_classes = [NoAuthentication],serializer_class = MultimediaSerializer,
parser_classes =(FormParser,MultiPartParser)

def upload_avatar(self,request ,pk = None,* args,** kwargs):
如果request._method中的'POST'或request._method中的'PATCH':
#编写代码以保存文件?
else =
multimedia = Multimedia.objects.filter(user_profiles_avatares__pk = pk)
page = self.paginate_queryset(多媒体)
serializer = self.get_pagination_serializer(页)
返回响应(serializer.data)

我的模型:

  class Women(models.Model):
user = models.OneToOneField(settings.AUTH_USER_MODEL)
avatar = models.ForeignKey(
' core.Multimedia',blank = True,null = True,
related_name ='user_profiles_avatares'


类多媒体(models.Model):
file = models fileField(upload_to = upload_to,null = True,blank = True)
thumbnail = models.FileField(upload_to = upload_to,null = True,blank = True)
pre>

基本上我想知道这是正确的路径,如果是,我如何正确保存上传的文件在模型??

解决方案

这是我为克服这个问题所做的一些代码。虽然凯文·布朗的回答可能有效,但我发现我的代码有点简单的方法:

  @detail_route(
方法= ['post','put','patch','get'],permission_classes = [AllowAny],
authentication_classes = [NoAuthentication],serializer_class = MultimediaSerializer,
parser_classes =(FormParser,MultiPartParser, )

def upload_avatar(self,request,pk = None):
#因为我们使用嵌套资源,这是我发现
#上传文件的唯一方法。也许有一个更好的方法
如果request.method在['PATCH','POST']:
avatar = request.FILES.get('avatar')
如果不是头像:
return Response(status = 404)

try:
woman = WomenNativePassport.objects.get(pk = pk)
除了WomenNativePassport.DoesNotExist:
return回复(status = 404)
else:
request.FILES ['thumbnail'] = request.FILES ['avatar']
serializer = AvatarSerializer(
data = request.DATA ,files = request.FILES

如果serializer.is_valid():
woman.avatar.thumbnail.save(str(avatar),File(avatar))
返回响应(status = 204)
else:
return响应(status = 404)
else:
multimedia = Multimedia.objec ts.filter(user_profiles_avatares__pk = pk)
page = self.paginate_queryset(多媒体)
serializer = self.get_pagination_serializer(页)
返回响应(serializer.data)


#serializer

class AvatarSerializer(serializers.Serializer):
thumbnail = serializers.ImageField()


So i have been trying to upload a file to a method using DRF with no luck so far.

I was able to upload to a ModelViewSet using (FormParser, MultiPartParser,) with no problems, but i really need to use it in something like this http://localhost:8000/api/v1/women/{pk}/upload_avatar/ where i want to first filter the woman by id and upload to her avatar (which is a foreign key to a multimedia model). I tried using a nested resource library with no luck.

So far i have in my modelviewset:

class WomenNativePassportViewSet(viewsets.ModelViewSet):
    queryset = Women.objects.all()
    serializer_class = WomenNativePassportSerializer
    authentication_classes = (NoAuthentication,)
    permission_classes = (AllowAny,)
    parser_classes = (FormParser, MultiPartParser,)

    @detail_route(
        methods=['post', 'put', 'patch', 'get'], permission_classes=[AllowAny],
        authentication_classes=[NoAuthentication], serializer_class=MultimediaSerializer,
        parser_classes=(FormParser, MultiPartParser,)
    )
    def upload_avatar(self, request, pk=None, *args, **kwargs):
        if 'POST' in request._method or 'PATCH' in request._method:
            # Write code to save the file??
        else:
            multimedia = Multimedia.objects.filter(user_profiles_avatares__pk=pk)
            page = self.paginate_queryset(multimedia)
            serializer = self.get_pagination_serializer(page)
        return Response(serializer.data)

My models:

class Women(models.Model):
    user = models.OneToOneField(settings.AUTH_USER_MODEL)
    avatar = models.ForeignKey(
        'core.Multimedia', blank=True, null=True,
        related_name='user_profiles_avatares'
    )

class Multimedia(models.Model):
    file = models.FileField(upload_to=upload_to, null=True, blank=True)
    thumbnail = models.FileField(upload_to=upload_to, null=True, blank=True)

Basically i want to know if this is the right path i am taking, and if yes how can i properly save the uploaded file in the model??

解决方案

Here is some code of what i did to overcome this problem. Although Kevin Brown answer probably works, i find my code a little "easier" approach:

    @detail_route(
        methods=['post', 'put', 'patch', 'get'], permission_classes=[AllowAny],
        authentication_classes=[NoAuthentication], serializer_class=MultimediaSerializer,
        parser_classes=(FormParser, MultiPartParser,)
    )
    def upload_avatar(self, request, pk=None):
        # Because we are using nested resources this was the only way i found to
        # upload a file. Maybe there is a better way
        if request.method in ['PATCH', 'POST']:
            avatar = request.FILES.get('avatar')
            if not avatar:
                return Response(status=404)

            try:
                woman = WomenNativePassport.objects.get(pk=pk)
            except WomenNativePassport.DoesNotExist:
                return Response(status=404)
            else:
                request.FILES['thumbnail'] = request.FILES['avatar']
                serializer = AvatarSerializer(
                    data=request.DATA, files=request.FILES
                )
                if serializer.is_valid():
                    woman.avatar.thumbnail.save(str(avatar), File(avatar))
                    return Response(status=204)
                else:
                    return Response(status=404)
        else:
            multimedia = Multimedia.objects.filter(user_profiles_avatares__pk=pk)
            page = self.paginate_queryset(multimedia)
            serializer = self.get_pagination_serializer(page)
            return Response(serializer.data)


# serializer 

class AvatarSerializer(serializers.Serializer):
    thumbnail = serializers.ImageField()

这篇关于Django Rest Framework将文件上传到一个方法的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆