KeyError: 'user_id' при использовании запроса PUT
Недавно начал работать с фреймворком Django REST. У меня есть таблица пользователей и еще одна таблица, в которой хранятся некоторые важные данные для каждого пользователя. Я прекрасно настроил методы POST/GET/DELETE, но не могу заставить работать метод perform_update - я постоянно получаю KeyError at /api/sdgdata/1 'user_id' ошибку в Postman, когда я пытаюсь выполнить запрос put для пользователя. Plz see code below:
Модели:
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
не был определен как поле в сериализаторе и не был передан в данных запроса. Похоже, вы хотите сохранить текущего пользователя в качестве поля user обновляемого экземпляра TestDataTwo
.
В этом случае вам не нужно переопределять update
, так как сохранение пользователя на основе self.request.user
на экземпляре TestDataTwo
уже сделано сериализатором 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].