Django rest PUT 请求序列化程序无法使用外键更新模型

思想家

我有两个模型,如下所示:

class Task(models.Model):
    user = models.ForeignKey(User, blank=True)
    what_task = models.CharField(max_length=100, )

    #This helps to print in admin interface
    def __str__(self):
        return u"%s" % (self.what_task)


class Step(models.Model):
    task = models.ForeignKey(Task, related_name='steps', on_delete=models.CASCADE, )
    what_step = models.CharField(max_length=50, blank=True, )

    #This helps to print in admin interface
    def __str__(self):
        return u"%s" % (self.what_step)

我已经编写了序列化程序:

class StepSerializer(serializers.ModelSerializer):
    class Meta:
        model = Step
        exclude = ('task',)

class TaskSerializer(serializers.ModelSerializer):
    steps = StepSerializer(many=True)
    class Meta:
        model = Task
        fields = '__all__'


    def create(self, validated_data):
        steps_data = validated_data.pop('steps')
        task = Task.objects.create(**validated_data)
        for step_data in steps_data:
            Step.objects.create(task=task, **step_data)
        return task 

    def update(self, instance, validated_data):
        steps_data = validated_data.pop('steps')

        instance.what_task = validated_data.get('what_task', instance.what_task)
        instance.how_often = validated_data.get('how_often', instance.how_often)
        instance.how_important = validated_data.get('how_important', instance.how_important)
        instance.why_perform = validated_data.get('why_perform', instance.why_perform)
        instance.why_important = validated_data.get('why_important', instance.why_important)
        instance.possible_improvement = validated_data.get('possible_improvement', instance.possible_improvement)
        instance.existing_solutions = validated_data.get('existing_solutions', instance.existing_solutions)
        instance.how_important_improvement = validated_data.get('how_important_improvement', instance.how_important_improvement)
        instance.advantages_of_improvement = validated_data.get('advantages_of_improvement', instance.advantages_of_improvement)

        instance.save()
        for step_data in steps_data:
            Step.objects.update(task=task, **step_data)
        return instance 

我的看法:

@api_view(['GET', 'POST'])
def task_list(request):
    """
    List all tasks, or create a new task.
    """
    if request.method == 'GET':
        print(request.user)
        tasks = Task.objects.filter(user=request.user.id)
        serializer = TaskSerializer(tasks, many=True)
        return Response(serializer.data)

    elif request.method == 'POST':
        serializer = TaskSerializer(data=request.data)
        print(request.data)
        if serializer.is_valid():
            serializer.save(user=request.user)
            return Response(serializer.data, status=status.HTTP_201_CREATED)
        else:
            return Response(
                serializer.errors, status=status.HTTP_400_BAD_REQUEST)


@api_view(['GET', 'PUT', 'DELETE'])
def task_detail(request, id):
    """
    Get, udpate, or delete a specific task
    """
    try:
        task = Task.objects.get(id=id)
    except Task.DoesNotExist:
        return Response(status=status.HTTP_404_NOT_FOUND)

    if request.method == 'GET':
        serializer = TaskSerializer(task)
        return Response(serializer.data)

    elif request.method == 'PUT':
        serializer = TaskSerializer(task, data=request.data)
        if serializer.is_valid():
            serializer.save(user=request.user)
            return Response(serializer.data)
        else:
            return Response(
                serializer.errors, status=status.HTTP_400_BAD_REQUEST)

    elif request.method == 'DELETE':
        task.delete()
        return Response(status=status.HTTP_204_NO_CONTENT)

我的GETPOST请求工作正常(视图中的第一个函数),我的任务和相关步骤是在单个请求中创建的,但是PUT请求是错误的,我不确定我是否正确更新了步骤;如果我从serializerfor 循环中注释掉,则任务更新成功。

我应该修改什么以及如何修改以便我可以使用相关步骤更新特定任务?

迈克尔·里戈尼

在您的 for 循环中,您更新每个现有任务(在 内update,您设置新值):

Step.objects.update(task=task, **step_data)

相反,在循环之前,您应该删除该任务的所有步骤并创建新步骤:

...
    Step.objects.filter(task=instance).delete()
    for step_data in steps_data:
        Step.objects.create(task=instance, **step_data)
...

更有效的方法是找到所有不存在的步骤(基于 id)validated_data并删除它们,用 id 更新步骤,创建没有 id 的步骤。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

使用ManyToManyField序列化模型时的Django REST错误

来自分类Dev

Django REST Framework批处理PUT(更新)

来自分类Dev

Django Rest Framework嵌套的序列化程序部分更新

来自分类Dev

HTTP PUT在Django Rest框架中无法正常工作

来自分类Dev

唯一模型字段上的Django Rest Framework PUT请求

来自分类Dev

REST PUT创建或更新

来自分类Dev

Django Rest Framework更新嵌套序列化程序

来自分类Dev

在Django Rest Framework中创建或更新(使用PUT)

来自分类Dev

在Django Rest Framework中,如何限制要序列化的外键对象的数量

来自分类Dev

Django Rest框架多个外键序列化

来自分类Dev

在Django Rest Framework中使用PUT更新外键

来自分类Dev

在Django Rest Framework中测试PUT请求

来自分类Dev

使用外键Django序列化模型

来自分类Dev

Django REST Framework:如何向使用穿透表的M2M序列化器添加外键?

来自分类Dev

Django rest框架使用FK序列化模型

来自分类Dev

模型,视图或序列化程序是否代表Django Rest Framework中的REST资源?

来自分类Dev

在保存Django-Rest-Framework序列化程序中包含外键

来自分类Dev

Django rest-framework如何序列化对象/外键

来自分类Dev

使用Django Rest Framework序列化程序更新现有模型

来自分类Dev

django rest框架外键序列化器问题

来自分类Dev

在Django Rest Framework中使用PUT更新外键

来自分类Dev

Django Rest Framework,外键字段的默认序列化程序

来自分类Dev

django rest框架外键序列化

来自分类Dev

Django Rest - 无法序列化项目

来自分类Dev

将参数传递给 Django REST 框架序列化程序以与模型一起使用

来自分类Dev

Django rest IntegrityError:1048,外键序列化器上的“列不能为空”

来自分类Dev

Django Rest Framework POST 和 PUT 外键 ModelSerializer

来自分类Dev

Django rest 框架序列化程序外键

来自分类Dev

Django Rest序列化程序外键是必需的错误

Related 相关文章

  1. 1

    使用ManyToManyField序列化模型时的Django REST错误

  2. 2

    Django REST Framework批处理PUT(更新)

  3. 3

    Django Rest Framework嵌套的序列化程序部分更新

  4. 4

    HTTP PUT在Django Rest框架中无法正常工作

  5. 5

    唯一模型字段上的Django Rest Framework PUT请求

  6. 6

    REST PUT创建或更新

  7. 7

    Django Rest Framework更新嵌套序列化程序

  8. 8

    在Django Rest Framework中创建或更新(使用PUT)

  9. 9

    在Django Rest Framework中,如何限制要序列化的外键对象的数量

  10. 10

    Django Rest框架多个外键序列化

  11. 11

    在Django Rest Framework中使用PUT更新外键

  12. 12

    在Django Rest Framework中测试PUT请求

  13. 13

    使用外键Django序列化模型

  14. 14

    Django REST Framework:如何向使用穿透表的M2M序列化器添加外键?

  15. 15

    Django rest框架使用FK序列化模型

  16. 16

    模型,视图或序列化程序是否代表Django Rest Framework中的REST资源?

  17. 17

    在保存Django-Rest-Framework序列化程序中包含外键

  18. 18

    Django rest-framework如何序列化对象/外键

  19. 19

    使用Django Rest Framework序列化程序更新现有模型

  20. 20

    django rest框架外键序列化器问题

  21. 21

    在Django Rest Framework中使用PUT更新外键

  22. 22

    Django Rest Framework,外键字段的默认序列化程序

  23. 23

    django rest框架外键序列化

  24. 24

    Django Rest - 无法序列化项目

  25. 25

    将参数传递给 Django REST 框架序列化程序以与模型一起使用

  26. 26

    Django rest IntegrityError:1048,外键序列化器上的“列不能为空”

  27. 27

    Django Rest Framework POST 和 PUT 外键 ModelSerializer

  28. 28

    Django rest 框架序列化程序外键

  29. 29

    Django Rest序列化程序外键是必需的错误

热门标签

归档