我想获取一条状态为 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 框架的
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
如果您不明白我的回答,请随时在下面评论。