我有一个订阅模型,如下所示
class Subscription(models.Model):
name = models.CharField(max_length=100)
quantity = models.IntegerField(max_length=20)
stripe_id = models.CharField(max_length=100)
user = models.ForeignKey(User)
我想创建一个端点,它允许POST, PATCH, DELETE, GET
所以我做了以下事情
视图.py
class SubscriptionDetail(viewsets.ModelViewSet):
serializer_class = SubscriptionSerializer
permission_classes = (IsAuthenticated,)
queryset = Subscription.objects.all()
序列化程序.py
class SubscriptionSerializer(serializers.ModelSerializer):
class Meta:
model = Subscription
fields = ('name','quantity', 'stripe_id')
def update(self, instance, validated_data):
print "In update"
#how do I write create and delete?
网址.py
subscription = SubscriptionDetail.as_view({
'patch': 'update'
})
url(r'^rest-auth/subscription/$', subscription, name='something'),
问题
PATCH
请求时,使用上面的方法会得到一个错误。我该怎么解决?Expected view SubscriptionDetail to be called with a URL keyword argument named "pk". Fix your URL conf, or set the
.lookup_field
attribute on the view correctly.
POST (create)
操作中的email
字段,以便知道订阅属于哪个用户。
为了创建一个对象,您必须实现官方文档中描述的create函数,可以找到here。对于修补,可以使用视图类中的部分参数:
对于订阅的删除,可以在视图类中执行delete调用时执行:
完整示例请参见this教程
此外,我认为应该在SubscriptionSerialiser元类中包含“id”字段,否则将很难进行更新/删除。我希望这有点帮助。
干杯, 托比
如果要使用允许执行这些操作的方法,则必须使用@detail_route(),其中还可以说明将使用哪些方法,如文档中所述:
@detail_route(方法=['post']) def set_password(self,request,pk=无): user=self.get_object() serializer=PasswordSerializer(data=request.data) ...
所以为了能够使用它们,您应该添加下一个decorator
@detail_route(methods=['post', 'patch'])
“将其他属性传递给.save()
。。。
可以通过在调用.save()时包含其他关键字参数来实现。例如:
serializer.save(owner=request.user)
这里我给你留下了更多信息的链接:
http://www.django-rest-framework.org/api-guide/serializers/#passing-additional-attributes-to-save
最简单的方法就是这样做。
保持模型类不变
视图.py
序列化程序.py
网址.py
相关问题 更多 >
编程相关推荐