2017-05-29 82 views
-1

models.py:媒體文件沒有正確返回

class FWVersion(models.Model): 
     bin_file = models.FileField(upload_to='fW_media/bin/') 
     date_created = models.DateTimeField(default=timezone.now) 
     name = models.CharField(max_length=64) 

serializers.py:

class UploadFWSerializer(serializers.ModelSerializer): 
    class Meta: 
     model = FWVersion 
     exclude = ('date_created',) 

class GetFWSerializer(serializers.ModelSerializer): 
    class Meta: 
     model = FWVersion 
     fields = ('name', 'bin_file', 
     ) 

views.py:

class GetFWView(viewsets.ModelViewSet): 
    queryset = FWVersion.objects.all() 
    serializer_class = serializers.GetFWSerializer 

    def get_object(self): 
     lastest_fw = FWVersion.objects.first() 
     return lastest_fw 

class UploadFWView(mixins.CreateModelMixin, 
        generics.GenericAPIView): 
    serializer_class = serializers.UploadFWSerializer 

    def post(self, request, *args, **kwargs): 
     return self.create(request, *args, **kwargs) 

我使用Django的休息 - 創建用於上傳和檢索最新版本.bin文件的API。 API正在工作,我可以在服務器上傳一個.bin文件。但是,當再次下載文件時,服務器會返回第一個上傳的文件(最早的文件),即使名稱,網址是最新上傳的文件。但有時候很少,它會返回最新的文件。我檢查了服務器文件,他們正在正確上傳。這是因爲Django緩存了一些還是我錯過了一些東西?請幫忙。

+0

您還沒有提供近乎足夠的信息。上傳和下載這些文件的代碼在哪裏? –

+0

@DanielRoseman現在添加了代碼。 – toothie

回答

0

你的代碼很清楚地調用中queryset的first(),所以我不確定爲什麼這種行爲會讓你感到驚訝。如果你想始終返回最新的一個,那麼你應該這樣做:

def get_object(self): 
    lastest_fw = FWVersion.objects.latest('date_created') 

順便說一句,你不應該使用視圖集中於這一觀點;它只支持一個操作,即GET,所以你應該只使用一個RetrieveAPIView

+0

即使我已經做出了您建議的更改,但它沒有幫助。問題是,即使我手動輸入最新的文件URL,服務器返回的文件也不是該文件,而是返回一箇舊文件。我之前用圖像文件做過這類事情,從來沒有遇到過問題,但在這種情況下,我想上傳bin文件。 – toothie

0
def get_attachment_path(instance, filename): 
    ext = os.path.splitext(filename)[1] 
    d = os.path.dirname(filename) 
    current_time = datetime.now().strftime('%Y%m%d-%H%M%S-%f')[:-3] 
    filename = os.path.join(d, current_time + ext) 
    return 'fW_media/bin/{}'.format(filename) 

class FWVersion(models.Model): 
    bin_file = models.FileField(upload_to=get_attachment_path) 
    name = models.CharField(max_length=64) 
    create_time = models.DateTimeField(auto_now_add=True) 


class GetFWView(viewsets.ModelViewSet): 
    queryset = FWVersion.objects.all() 
    serializer_class = GetFWSerializer 

    def create(self, request, *args, **kwargs): 
     serializer = UploadFWSerializer(data=request.data) 
     if serializer.is_valid(): 
      instance = serializer.create(serializer.validated_data) 
      return Response('upload success') 
     else: 
      return Response(serializer.errors) 

    @list_route(methods=['GET']) 
    def get_latest(self, request): 
     lastest_fw = FWVersion.objects.latest('create_time') 
     serializer = self.get_serializer(lastest_fw) 
     return Response(serializer.data)