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