我正在创建一个包含Item
和Customer
个对象的应用程序。 Customer
的属性watchList
是Item
的列表。
现在我想为这些监视列表创建一个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,该方法将被执行)?
答案 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
方法。