【发布时间】:2021-11-22 08:57:57
【问题描述】:
最近开始使用 Django REST 框架。我有一个用户表和另一个表,用于存储每个用户的一些相关数据。我已经很好地设置了 POST/GET/DELETE 方法,但是我无法让 perform_update 工作的方法 - 我在 /api/sdgdata/1 处不断收到 KeyError 当我尝试对用户发出 put 请求时,Postman 中出现“user_id”错误。请看下面的代码:
型号:
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 的引用...感谢任何帮助。
【问题讨论】:
-
这是因为序列化程序在
Meta中没有基于fields的字段user_id -
嗨@BrianD,我将user_id 字段添加到序列化程序中,但关键错误问题仍然存在。我是否在视图中的 perform_update 方法中遗漏了一些东西? 更新的序列化程序: 类 Meta:model = TestDataTwo fields = ( "id", "user_id", "test_name", )
-
根据您的代码,您希望用户基于
request.user对吗?在这种情况下,由于您已经在serializer.save中将其传递到perform_update中,因此您不必处理它。我会试着写一个答案
标签: django postgresql django-rest-framework postman