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]。
最近开始使用 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]。