Python 可浏览api中自定义方法的集成

Python 可浏览api中自定义方法的集成,python,django,django-rest-framework,Python,Django,Django Rest Framework,我正在创建一个具有项和客户对象的应用程序。客户有一个属性监视列表,它是项目的列表 现在我想为这些监视列表创建一个RESTAPI。它应该列出当前客户观察列表中的所有项目,并提供向列表中添加(现有)项目的方法 class WatchListViewSet(viewsets.ViewSet): permission_classes = (IsAuthenticated,) serializer_class = ItemSerializer def get_queryset(s

我正在创建一个具有
客户
对象的应用程序。
客户
有一个属性
监视列表
,它是
项目的列表

现在我想为这些监视列表创建一个RESTAPI。它应该列出当前客户观察列表中的所有项目,并提供向列表中添加(现有)项目的方法

class WatchListViewSet(viewsets.ViewSet):
    permission_classes = (IsAuthenticated,)
    serializer_class = ItemSerializer

    def get_queryset(self):
        return Customer.objects.get(user = self.request.user).watchList

    def list(self, request):
        queryset = Customer.objects.get(user = self.request.user).watchList
        serializer = ItemSerializer(queryset, context={'request': request}, many=True)
        return Response(serializer.data)

    @list_route(methods=['POST'])
    def add(self, request, *args, **kwargs):
        #request.data.id contains the id of the item that should be added
        # ...
        return Response(status=status.HTTP_201_CREATED)
但是,当我请求
localhost:800/api/watchList/add/
时,我看到的是一个
项目的表单,而不是现有项目id的输入(或者更好的是,一个下拉/选择字段)


如何通知可浏览api请求的输入类型与视图集的其余部分不同?这是否可以连接到某种自动验证(如果没有传递id,则不会执行该方法)?

结果证明这解决了我的问题:

class ItemIdSerializer(serializers.HyperlinkedModelSerializer):
    id = serializers.IntegerField()

    class Meta:
        model = Item
        fields = ('id',)

如果执行了
add
操作,则方法
get\u serializer
返回特殊的
ItemIdSerializer

通过将属性
id
定义为
serializers.IntegerField()
将覆盖隐藏只读属性
id
的默认行为

但是,这种方法不提供任何自动验证,仍然可以在不提供id的情况下执行
add
方法

class WatchListViewSet(viewsets.ViewSet):
    permission_classes = (IsAuthenticated,)

    def get_serializer(self):
        if self.action == WatchListViewSet.add.__name__:
            return ItemIdSerializer()
        return super(WatchListViewSet, self).get_serializer()