【问题标题】:Media files not being returned properly媒体文件未正确返回
【发布时间】:2017-10-29 17:54:08
【问题描述】:

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

【问题讨论】:

  • 您没有提供足够的信息。上传和下载这些文件的代码在哪里?
  • @DanielRoseman 现在添加代码。

标签: python django caching django-rest-framework


【解决方案1】:

您的代码非常清楚地在GetFWView 的查询集上调用了first(),所以我不确定为什么这种行为会让您感到惊讶。如果您想始终返回最新的,那么您应该这样做:

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

顺便说一句,您不应该为该视图使用 ViewSet;它只支持一种操作,即 GET,所以你应该使用RetrieveAPIView

【讨论】:

  • 即使我已经做出了您建议的更改,但它没有帮助。问题是,即使我手动输入最新的文件 URL,服务器返回的文件也不是那个文件,而是返回一个旧文件。我之前对图像文件做过这种事情,从来没有遇到过问题,但在这种情况下,我想上传 bin 文件。
【解决方案2】:
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)

【讨论】:

    猜你喜欢
    • 2021-03-02
    • 2014-05-21
    • 1970-01-01
    • 2014-04-12
    • 1970-01-01
    • 2014-06-22
    • 1970-01-01
    • 2010-09-23
    相关资源
    最近更新 更多