Django rest framework 如何编写允许在url本身中输入值的API

Django 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

我有以下课程:

型号.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)),
]
视图.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而不是标准方式进行更新。