2017-05-29 64 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)