首页 > 解决方案 > GET 应该用于详细信息,但 POST 不应该用于 Django-Rest-Framework 中的操作方法

问题描述

在我的应用程序中,有一些元素称为DemanderCollection行,其中包含有关称为特征集合的重要元数据Demander

我有一个 ViewSet,我用它来返回与我的数据库中Demander的特定对象相关联的对象,这些对象DemanderCollection编码为 GeoJSON(一种用于交换地理数据的特定 JSON),并且它绑定到一个名为的特殊操作方法geojson

class DemanderCollectionViewSet(
    mixins.CreateModelMixin,
    mixins.RetrieveModelMixin,
    mixins.ListModelMixin,
    viewsets.GenericViewSet
):

    queryset = DemanderCollection.objects.all()
    serializer_class = DemanderCollectionSerializer

    @action(detail=True, methods=["get"])
    def geojson(self, request, *args, **kwargs):
        demanders = Demander.objects.filter(demandercollection=self.get_object())
        return Response(serialize('geojson', demanders, geometry_field='geom', fields=('name',)))

这个特殊的操作方法设置为,detail=True因为我只想返回一个DemanderCollection值的Demander特性。

我还想允许用户DemanderCollection通过将 GeoJSON 发布到同一个端点(通过验证以确保属性/列有效)来发布新的。

但问题是现在该geojson方法已经定义为 being detail=True,所以我不能发布到端点

.../api/demandercollections/geojson

因为它期望在两者之间有一个 id,比如

.../api/demandercollections/0/geojson

我可以在发出 POST 请求时让geojson端点忽略吗?detail=True

标签: django-rest-framework

解决方案


推荐阅读