API 视图中的 Django Rest 框架更新方法以更改 db json 中的值

Abh*_*hek 2 python django json django-rest-framework

我在 django Rest 框架项目中有一个 api.py 视图,编写如下:

class StudentAcademicProgramList2(APIView):
    def get(self, request, format=None):
        student_academic_program = Student_academic_program.objects.filter(student=2773951)
        serialized_Student_academic_program = StudentAcademicProgramSerializer2(student_academic_program, many=True)
        return Response(serialized_Student_academic_program.data)

    def update(self, request, format=None):
        student_academic_program = Student_academic_program.objects.filter(student=2773951)
        serializer = StudentAcademicProgramSerializer2(student_academic_program, many=True)

        for x in xrange(0,len(serializer.data)):
            serializer.primary_program = False

        if serializer.is_valid():
            serializer.save()
            return Response(serializer.data, status = status.HTTP_201_CREATED)
        return Response(serializer.errors, status = status.HTTP_400_BAD_REQUEST)

    def post(self, request, format=None):
        serializer = StudentAcademicProgramSerializer2(data = request.DATA)
        if serializer.is_valid():
            serializer.save()
            return Response(serializer.data, status= status.HTTP_201_CREATED)
        return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST)

    def delete(self, request, format=None):
        student_academic_program = Student_academic_program.objects.filter(student=2773951)
        student_academic_program.delete()
        return Response(status = status.HTTP_204_NO_CONTENT)
Run Code Online (Sandbox Code Playgroud)

它获取到的json格式如下:

[
    {
        "id": 3684, 
        "student": 2773951, 
        "academic_program": 595, 
        "credits_completed": 28, 
        "academic_program_gpa": null, 
        "primary_program": false
    }, 
    {
        "id": 3685, 
        "student": 2773951, 
        "academic_program": 596, 
        "credits_completed": 26, 
        "academic_program_gpa": null, 
        "primary_program": true
    }
]
Run Code Online (Sandbox Code Playgroud)

每当我在 json api 中获取和发布一些数据时,这两个类都可以很好地工作。

我如何update()在 apiview 中编写一个函数,以便它更改所有primary_programjson 中的所有值更改为 false?由于 for 循环,我编写的更新函数将无法工作。我怎样才能改变这个功能?

编辑:

我尝试了 @Fabiano 的答案,但序列化器没有更新数据库中的任何内容。

小智 6

def update(self, request, *args, **kwargs):\n    data = request.DATA\n    qs = Student_academic_program.objects.filter(student=2773951)\n    serializer = StudentAcademicProgramSerializer(qs, data=data, many=True)\n\n    if serializer.is_valid():\n        serializer.save()\n\n        return Response(serializer.data)\n\n    ...\n
Run Code Online (Sandbox Code Playgroud)\n\n

或者你可以允许用户做一个补丁,在这种情况下你只需要在序列化器构造函数上添加 \xc2\xb4partial=True\xc2\xb4 。\n如果你允许用户做一个补丁,那么用户可以更改仅primary_program 字段。

\n\n
    serializer = StudentAcademicProgramSerializer(qs, data=data, many=True, partial=True)\n
Run Code Online (Sandbox Code Playgroud)\n\n

您可以在文档中查看更多信息:\n http://www.django-rest-framework.org/api-guide/serializers#dealing-with-multiple-objects

\n