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

时间:2016-02-03 16:26:55

标签: python django django-rest-framework

我正在创建一个包含ItemCustomer个对象的应用程序。 Customer的属性watchListItem的列表。

现在我想为这些监视列表创建一个REST api。它应列出当前客户的监视列表中的所有项目,并提供将(已存在的)项目添加到列表中的方法。

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/时,我看到item的表单不是现有项ID的输入(甚至更好,下拉/选择字段)。

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

1 个答案:

答案 0 :(得分:0)

原来这解决了我的问题:

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

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

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()

如果get_serializer操作已执行,方法ItemIdSerializer将返回特殊add
通过将属性id定义为serializers.IntegerField(),隐藏了只读属性id的默认行为将被覆盖。

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