未正确返回媒体文件

2024-10-02 18:28:17 发布

您现在位置:Python中文网/ 问答频道 /正文

型号。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 rest框架创建用于上载和检索.bin文件最新版本的API。API正在工作,我可以在服务器上上传.bin文件。但当再次下载文件时,服务器返回第一个上载的文件(最旧的文件),即使名称、url是最新上载的文件。但有时很少返回最新的文件。我已经检查了服务器文件,它们正在正确上传。这是因为Django的一些缓存还是我遗漏了什么?请帮忙


Tags: 文件namepyselfdatebinmodelsmeta
2条回答

您的代码非常清楚地调用了GetFWView中查询集上的first(),因此我不知道为什么这种行为会让您感到惊讶。如果要始终返回最新的,则应执行以下操作:

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

另一方面,您不应该为该视图使用视图集;它只支持一个操作,即GET,因此您应该只使用RetrieveAPIView

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)

相关问题 更多 >