Django rest framework 如何编写允许在url本身中输入值的API
我有以下课程: 型号.pyDjango rest framework 如何编写允许在url本身中输入值的API,django-rest-framework,Django Rest Framework,我有以下课程: 型号.py class User(models.Model): name = models.CharField(mex_length=50) email = models.EmailField(max_length=100) department = models.CharField(max_length=50) def __str__(self): return self.name class UserViewSet(view
class User(models.Model):
name = models.CharField(mex_length=50)
email = models.EmailField(max_length=100)
department = models.CharField(max_length=50)
def __str__(self):
return self.name
class UserViewSet(viewsets.ModelViewSet):
serializer_class = UserSerializer
queryset = User.objects.all()
@action(methods=['PUT'], detail=True)
def update_department(self, request, *args, **kwargs)
obj = self.get_object()
??
from django.conf.urls import url
from django.conf.urls import include
from rest_framework import routers
from . import views
router = routers.DefaultRouter()
router.register(r'user', views.UserViewSet, base_name='user_view')
slashless_router = routers.DefaultRouter(trailing_slash=False)
slashless_router.registry = router.registry[:]
urlpatterns = [
url(r'', include(router.urls)),
url(r'', include(slashless_router.urls)),
]
视图.py
class User(models.Model):
name = models.CharField(mex_length=50)
email = models.EmailField(max_length=100)
department = models.CharField(max_length=50)
def __str__(self):
return self.name
class UserViewSet(viewsets.ModelViewSet):
serializer_class = UserSerializer
queryset = User.objects.all()
@action(methods=['PUT'], detail=True)
def update_department(self, request, *args, **kwargs)
obj = self.get_object()
??
from django.conf.urls import url
from django.conf.urls import include
from rest_framework import routers
from . import views
router = routers.DefaultRouter()
router.register(r'user', views.UserViewSet, base_name='user_view')
slashless_router = routers.DefaultRouter(trailing_slash=False)
slashless_router.registry = router.registry[:]
urlpatterns = [
url(r'', include(router.urls)),
url(r'', include(slashless_router.urls)),
]
现在我的数据库中有2个用户:
{
"id": 1,
"name": "abcd",
"email": "abcd@gmail.com",
"department": "accounts"
}
我想用api将用户2的部门更新为“帐户”,如下所示,我通过api url本身传递要更新的值:
放置“/api/user/2/更新部门/账户”
如何使用DRF实现这一点
url.py
class User(models.Model):
name = models.CharField(mex_length=50)
email = models.EmailField(max_length=100)
department = models.CharField(max_length=50)
def __str__(self):
return self.name
class UserViewSet(viewsets.ModelViewSet):
serializer_class = UserSerializer
queryset = User.objects.all()
@action(methods=['PUT'], detail=True)
def update_department(self, request, *args, **kwargs)
obj = self.get_object()
??
from django.conf.urls import url
from django.conf.urls import include
from rest_framework import routers
from . import views
router = routers.DefaultRouter()
router.register(r'user', views.UserViewSet, base_name='user_view')
slashless_router = routers.DefaultRouter(trailing_slash=False)
slashless_router.registry = router.registry[:]
urlpatterns = [
url(r'', include(router.urls)),
url(r'', include(slashless_router.urls)),
]
您不需要在
模型视图集中定义额外的操作更新部门
。
只需向
发送一个HTTP补丁
请求,json负载为{“部门”:“账户”}
补丁
请求只会更新部门
用户
实例的id=2
字段
更新-1
class UserViewSet(ViewSet.ModelViewSet):
serializer\u class=UserSerializer
queryset=User.objects.all()
@操作(方法=['PUT'],细节=True)
def更新部门(自我、请求、部门、*args、**kwargs):
obj=self.get_object()
部门
obj.save()
返回响应(“更新”)
更新-2
将url模式更改为
urlpatterns = [
url(r'', include(router.urls)),
url(r'', include(slashless_router.urls)),
url(r'user/(?P<pk>[0-9]+)/update_department/(?P<department>[a-zA-Z]+)', views.UserViewSet.as_view({"put": "update_department"}))
]
urlpatterns=[
url(r“”,包括(router.url)),
url(r“”,包括(slashless_router.url)),
url(r'user/(?P[0-9]+)/update_department/(?P[a-zA-Z]+)',views.UserViewSet.as_view({“put”:“update_department”}))
]
您不需要在您的模型视图集中定义额外的操作更新部门
。
只需向
发送一个HTTP补丁
请求,json负载为{“部门”:“账户”}
补丁
请求只会更新部门
用户
实例的id=2
字段
更新-1
class UserViewSet(ViewSet.ModelViewSet):
serializer\u class=UserSerializer
queryset=User.objects.all()
@操作(方法=['PUT'],细节=True)
def更新部门(自我、请求、部门、*args、**kwargs):
obj=self.get_object()
部门
obj.save()
返回响应(“更新”)
更新-2
将url模式更改为
urlpatterns = [
url(r'', include(router.urls)),
url(r'', include(slashless_router.urls)),
url(r'user/(?P<pk>[0-9]+)/update_department/(?P<department>[a-zA-Z]+)', views.UserViewSet.as_view({"put": "update_department"}))
]
urlpatterns=[
url(r“”,包括(router.url)),
url(r“”,包括(slashless_router.url)),
url(r'user/(?P[0-9]+)/update_department/(?P[a-zA-Z]+)',views.UserViewSet.as_view({“put”:“update_department”}))
]
谢谢,但是api是否可以构建为将要更新的值传递到url本身而不是单独的json负载中?这是可能的。但是,我不建议这样做。因为如果您有N
个字段,并且您希望更新所有字段,该怎么办。您会在视图类中编写更新操作吗??(如果我是,显然不是)我能问你一件事吗?在URL中发送数据有什么具体原因吗@codecrazy46没有具体的原因,但是我需要做一个小的更新,例如,有一个模型用户,其中有一个isAdmin字段,该字段对用户来说是正确的。我希望能够从url本身将其更改为false,而不是在上面的问题之外传递一个单独的负载。您需要更新一些字段,例如部门
,是_admin
等,并且您正在尝试通过URL而不是标准方式进行更新。谢谢,但是api是否可以构建为在URL本身而不是单独的json负载中传递要更新的值?这是可能的。但是,我不建议这样做。因为如果您有N
个字段,并且您希望更新所有字段,该怎么办。您会在视图类中编写更新操作吗??(如果我是,显然不是)我能问你一件事吗?在URL中发送数据有什么具体原因吗@codecrazy46没有具体的原因,但是我需要做一个小的更新,例如,有一个模型用户,其中有一个isAdmin字段,该字段对用户来说是正确的。我希望能够从url本身将其更改为false,而不是在上面的问题之外传递一个单独的负载。您需要更新一些字段,例如部门
,是管理员
等,您试图通过URL而不是标准方式进行更新。