Django Rest Framework将文件上传到一个方法 [英] Django Rest Framework upload file to a method
问题描述
所以我一直在尝试使用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):
pre>
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)
基本上我想知道这是正确的路径,如果是,我如何正确保存上传的文件在模型??
解决方案这是我为克服这个问题所做的一些代码。虽然凯文·布朗的回答可能有效,但我发现我的代码有点简单的方法:
@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 thishttp://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屋!