Django Detail查看并更新Filefield

时间:2019-05-19 15:30:46

标签: django django-rest-framework

我有模特

class File(models.Model):
    name = models.CharField(max_length=30, default='.cc')
    codefile = models.FileField(...)

使用序列化程序

class FileSerializer(serializers.ModelSerializer):
    class Meta:
        model = File
        fields = ('id', 'name', 'codefile')
        read_only_fields = ('id', 'name')

和视图集

class FileViewSet(viewsets.GenericViewSet,
                            mixins.ListModelMixin,
                            mixins.CreateModelMixin):
    queryset = File.objects.all()
    serializer_class = serializers.FileSerializer



    def perform_create(self, serializer):
        serializer.save(name=self.request.data['codefile'])

因此,通过转到localhost:8000 / files,我看到了所有File对象的列表,并且可以通过post上传新文件。

如何使用django rest框架实现详细视图,例如

localhost:8000 / files / 5

我会看到pk = 5的文件名和文件,并且可以选择更新/重新上传此代码文件吗?

2 个答案:

答案 0 :(得分:2)

实际上,这很容易-由于您需要完整的REST操作,因此可以只继承ModelViewSet的子类:

class FileViewSet(viewsets.ModelViewSet):
    queryset = File.objects.all()
    serializer_class = FileSerializer

    def perform_create(self, serializer):
        serializer.save(name=self.request.data['codefile'])

    def perform_update(self, serializer):
        serializer.save(name=self.request.data['codefile'])

我们只需要创建与您的perform_update相同的perform_create方法,即可在更改文件时更新name字段。

答案 1 :(得分:0)

您可能想将此类添加到视图:

class FileDetail(generics.RetrieveAPIView):
    queryset = File.objects.all()
    serializer_class = FileSerializer

当然,您需要在url_patterns中更新urls.py

我想您需要添加:

urlpatterns = [
    ...
    path('file/<int:pk>/', views.FileDetail.as_view()),
    ...
]