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:

Get

Почтальон PUT:

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].

Вернуться на верх