gpt4 book ai didi

python - 如何在 django rest 框架中支持端点的所有 REST 操作

转载 作者:太空狗 更新时间:2023-10-29 18:00:11 25 4
gpt4 key购买 nike

我有一个看起来像这样的订阅模式

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

于是我做了以下事情

View .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'),

问题

  1. 当我发送一个 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.

  1. 在发送补丁请求时,我还想发送订阅模式中没有的“电子邮件”字段。这可能吗?我需要 POST (create) 操作中的 email 字段,以便我知道订阅属于哪个用户。

最佳答案

最简单的方法就是这样做。

保持模型类相同

View .py

from rest_framework import viewsets
#impost serializer and model class for subscription

class SubscriptionViewSet(viewsets.ModelViewSet):

serializer_class = SubscriptionSerializer

def get_queryset(self):
queryset = Subscription.objects.all()
#if you need to get subscription by name
name = self.request.QUERY_PARAMS.get('name', None)
if name is not None:
queryset = queryset.filter(name=name)

return queryset

序列化器.py

 class SubscriptionSerializer(serializers.ModelSerializer):
class Meta:
model = Subscription
fields = ('name','quantity', 'stripe_id')

# django will handle get, delete,patch, update for you ....
# for customization you can use def update or def create ... to do whatever you need
# def create(self, validated_data):
# you can handle the email here
# and something like subscription= Subscription (name=validated_data['name'],vendor=validated_data['quantity']...)
# subscription.save()
# it will save whatever you want

网址.py

#use the router to handle everything for you
from django.conf.urls import patterns, include, url
from rest_framework import routers
#import your classes


router = routers.DefaultRouter()
router.register(r'subscription', views.SubscriptionViewSet,base_name='subscription')

urlpatterns = patterns('',
url(r'^', include(router.urls)),

)

关于python - 如何在 django rest 框架中支持端点的所有 REST 操作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29178839/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com