2014-10-31 13 views
5

पर फ़ाइल अपलोड करें तो मैं अब तक कोई भाग्य नहीं होने के साथ डीआरएफ का उपयोग करके एक विधि में फ़ाइल अपलोड करने का प्रयास कर रहा हूं।Django Rest Framework एक विधि

मैं एक ModelViewSet का उपयोग कर कोई समस्या नहीं के साथ (FormParser, MultiPartParser,) को अपलोड करने में सक्षम था, लेकिन मैं वास्तव में इस http://localhost:8000/api/v1/women/{pk}/upload_avatar/ की तरह कुछ में इसका उपयोग करना मैं कहाँ पहले id के आधार पर स्त्री को फ़िल्टर और उसके अवतार पर अपलोड (जो एक विदेशी है करना चाहते हैं की जरूरत है एक मल्टीमीडिया मॉडल के लिए कुंजी)। मैंने बिना किसी किस्मत के एक नेस्टेड संसाधन पुस्तकालय का उपयोग करने की कोशिश की।

अब तक मैं अपने 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) 

मेरे मॉडल:

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) 

असल में मैं अगर यह सही रास्ते मैं ले रहा हूँ है जानना चाहता हूँ, और अगर हां मैं कैसे कर सकते हैं मॉडल में अपलोड की गई फाइल को सही ढंग से सेव करें ??

उत्तर

6

यहां कुछ समस्या है जो मैंने इस समस्या को दूर करने के लिए किया था। हालांकि केविन ब्राउन उत्तर शायद काम करता है, मुझे अपना कोड थोड़ा "आसान" दृष्टिकोण मिलता है:

@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() 
+4

मैं 'request.method' के रूप में' request.method 'के रूप में' request.method 'में' request.method 'जैसा दिखने के लिए विधि जांच को बदलने का सुझाव देता हूं। एकल विधि – gregoltsov

0

कोई भी अपलोड की गई फाइल request.FILES में उपलब्ध होनी चाहिए, जो उस क्षेत्र द्वारा कुंजीपटल है जिसे अपलोड करते समय उपयोग किया गया था। एक बार आपके पास फ़ाइल हो जाने के बाद, यह किसी अन्य uploaded file in Django के समान इसे संभालने का विषय है।

यदि आप कर सकते हैं, तो मैं एक दूसरे धारावाहिक का उपयोग करूंगा जो Multimedia मॉडल को लपेटता है ताकि छवि सत्यापन और बचत Django REST Framework के माध्यम से स्वचालित रूप से किया जा सके। an ImageField है जो स्वचालित रूप से Pillow द्वारा छवि को सत्यापित करेगा जिसे आप धारावाहिक पर उपयोग कर सकते हैं।

+0

क्या यह आपको सही लगता है? http://paste.ubuntu.com/8760416/ – psychok7