API视图中的Django rest framework update方法以更改db json中的值

2024-05-19 14:14:12 发布

您现在位置:Python中文网/ 问答频道 /正文

我在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)

它得到的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
    }
]

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

如何在apiview中编写一个update()函数,以便将json中的所有primary_program值更改为false?由于for循环,我编写的更新函数将无法工作。如何更改此函数?

编辑:

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


Tags: selfnoneformathttpdatareturnresponserequest
1条回答
网友
1楼 · 发布于 2024-05-19 14:14:12
def update(self, request, *args, **kwargs):
    data = request.DATA
    qs = Student_academic_program.objects.filter(student=2773951)
    serializer = StudentAcademicProgramSerializer(qs, data=data, many=True)

    if serializer.is_valid():
        serializer.save()

        return Response(serializer.data)

    ...

或者您可以允许用户执行修补程序,在这种情况下,您只需要在序列化程序构造函数上添加“partial=True”。 如果允许用户执行修补程序,则用户只能更改主程序字段。

    serializer = StudentAcademicProgramSerializer(qs, data=data, many=True, partial=True)

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

相关问题 更多 >