KeyError: 'user_id' when using PUT request

KeyError: 'user_id' when using PUT request

最近开始使用 Django REST 框架。我有一个用户 table 和另一个 table 为每个用户存储一些相关数据。我已经很好地设置了 POST/GET/DELETE 方法,但是我无法使 perform_update 的方法正常工作 - 我一直在 /api/sdgdata/1 处收到 KeyError 'user_id' 当我尝试为用户发出放置请求时,Postman 出现错误。请看下面的代码:

型号:

class TestDataTwo(models.Model):
    user = models.ForeignKey("auth.User", related_name="testdatatwo", on_delete=models.CASCADE)
    test_name = models.CharField(max_length=1024, null=True, default="N/A")

序列化程序:

class TestDataTwoSerializer(serializers.ModelSerializer):

    class Meta:
        model = TestDataTwo
        fields = (
            "id",
            "test_name",
        )

    def update(self, instance, validated_data):

        # get user id from validated data:
        user_id = validated_data.pop('user_id')

        # get user:
        user = User.objects.get(id=user_id)

        # set user on instance:
        instance.user = user
        instance.save()

        # continue with update method:
        super().update(instance, validated_data)

观看次数:

class TestDataTwoViewSet(ModelViewSet):
    queryset = TestDataTwo.objects.all().order_by('id')
    serializer_class = TestDataTwoSerializer
    paginator = None

    # CREATE NEW TESTDATATWO ROW FOR USER
    def perform_create(self, serializer):
        serializer.save(user=self.request.user)

    # GET ALL ENTRIES OF TESTDATATWO FOR SPECIFIC USER, EXCEPT IF SUPERUSER, THEN RETURN ALL
    def get_queryset(self):
        # if self.request.user.is_superuser:
        #     return self.queryset
        # else:
        return self.queryset.filter(user=self.request.user)

    def perform_update(self, serializer):
        instance = self.get_object()
        serializer.save(user=self.request.user)
        return Response(serializer.data, status=status.HTTP_200_OK)

    # DELETE TESTDATATWO ID
    def destroy(self, request, *args, **kwargs):
        instance = self.get_object()
        self.perform_destroy(instance)
        return Response(status=status.HTTP_204_NO_CONTENT)

邮递员 GET:

邮递员 PUT:

我已经尝试了 perform_update 方法的多种变体,但我猜我遗漏了对用户 user_id 的引用...感谢任何帮助。

此错误是由 validated_data.pop('user_id') 引起的,因为 user_id 未定义为序列化程序上的字段,也未在请求数据中传递。您的目标似乎是将当前用户保存为正在更新的 TestDataTwo 实例的用户字段。

在那种情况下,您不需要覆盖 update,因为在 TestDataTwo 实例上基于 self.request.user 保存用户已经由序列化程序的 save 这里:

def perform_update(self, serializer):
    serializer.save(user=self.request.user)

这意味着您不必再在序列化程序中进行任何处理,因此它可以只是:

class TestDataTwoSerializer(serializers.ModelSerializer):
    class Meta:
        model = TestDataTwo
        fields = ("id", "test_name",)

    # No need to override update for saving self.request.user to `TestDataTwo`'s user

有关此功能的更多信息,您可以阅读 here..[DRF-docs-Passing-additional-attributes-to-save]