在 Django Rest 框架中如何在单个 api 调用中实现获取和更新记录

问题描述 投票:0回答:1

我想获取一条状态为 NEW 的记录,并在单个 api 调用中更新状态“INPROGRESS”,我怎样才能实现这一目标?

模型.py

class Task(models.Model):
    task= models.CharField(primary_key=True,max_length=200,null=False)
    status=models.CharField(max_length=10)
    remark=models.CharField(max_length=200)
    create_date = models.DateField(blank=True, null=True)
    create_id = models.CharField(max_length=20, blank=True, null=True)
    update_date = models.DateField(blank=True, null=True)
    update_id = models.CharField(max_length=20, blank=True, null=True)

view.py

class TaskViewSet(viewsets.ModelViewSet):
    queryset = Task.objects.filter(status='NEW')[:1];
    serializer_class = TaskSerializer
    permission_classes = [permissions.IsAuthenticated]
django-rest-framework
1个回答
0
投票

Django Rest 框架的

modelviewset
为每种视图类型提供单独的功能,例如列表视图、详细视图等。您只需覆盖其中之一即可修改其功能。 看一下

class UserViewSet(viewsets.ViewSet):
    """
    Example empty viewset demonstrating the standard
    actions that will be handled by a router class.

    If you're using format suffixes, make sure to also include
    the `format=None` keyword argument for each action.
    """

    def list(self, request):
        pass

    def create(self, request):
        pass

    def retrieve(self, request, pk=None):
        pass

    def update(self, request, pk=None):
        pass

    def partial_update(self, request, pk=None):
        pass

    def destroy(self, request, pk=None):
        pass

(不要忘记 modelviewset 为每个 CRUD 操作生成单独的 api 端点,例如:创建、读取、更新、删除、详细信息)

正如您在这里所看到的,我们为任何类型的操作提供了首选功能。因此,您可以通过

pk
参数获取所需记录来执行您想做的任何操作,并在完成此过程后,通过已处理的对象的某个关系字段获取它来对第二个执行您想做的操作,或者通过请求附带的一些 get 参数,以防它没有通过关系字段连接到对象:

致电:

request.get('/api/endpoint/update/pk=222?second_object_id=23')

我将向您提供一个示例,说明如何在更新 api 端点中实现此目的。

您查看:

class UserViewSet(viewsets.ViewSet):

    def update(self, request, pk=None):
        # get the main objects and modify
        object = Model.objects.get(pk=pk)
        object.status = 'NEW'
        object.save()
        
        # get second object with the id given in get parameter
        second_object = Model.objects.get(pk=request.GET.get('second_object_id'))
        second_object.status = 'INPROCESS'
        second_object.save()
        return Response({"suceess": True}) # or whatever

如果您不明白我的回答,请随时在下面评论。

© www.soinside.com 2019 - 2024. All rights reserved.