Невозможно присвоить "...'": "TestData.user" должен быть экземпляром "User".
Очень новичок в Django Rest Framework, поэтому буду признателен за помощь в этом вопросе. Я получаю ошибку в заголовке, когда пытаюсь выполнить POST запрос в Postman с соответствующим маркером аута.
Я создал таблицу, в которую хочу отправить POST запрос, но у меня проблемы с тем, чтобы пользователь FK был принят в качестве одного из столбцов. Посмотрите модель/сериализатор/представление ниже:
Модель
class TestData (models.Model):
TestSDG = models.DecimalField(decimal_places=0, max_digits=2, default=0)
user = models.ForeignKey("auth.User", related_name="testdata", on_delete=models.CASCADE)
Сериализатор
class TestDataSerializer(serializers.ModelSerializer):
class Meta:
model = TestData
fields = ('id', 'TestSDG')
Вид
@csrf_exempt
def testDataApi(request, id=0):
if request.method == 'GET':
testdata = TestData.objects.all()
testdata_serializer = TestDataSerializer(testdata,many=True)
return JsonResponse(testdata_serializer.data,safe=False)
elif request.method == 'POST':
testdata_data=JSONParser().parse(request)
testdata_serializer=TestDataSerializer(data=testdata_data)
if testdata_serializer.is_valid():
testdata_serializer.save(user=request.user)
return JsonResponse("Added Successfully", safe=False)
POST запрос работает нормально, если я не использую пользователя как внешний ключ, и я меняю testdata_serializer.save(user=request.user)
обратно на testdata_serializer.save()
, но я хочу, чтобы таблица требовала id пользователя.
Оцените любую помощь, спасибо.
Вы должны использовать ModelViewset
в вашем файле views.py - тогда вы можете переопределить метод update
на вашем сериализаторе:
views.py
from rest_framework.viewsets import ModelViewSet
class TestDataViewSet(ModelViewSet):
queryset = TestData.objects.all()
serializer_class = TestDataSerializer
serializers.py
class TestDataSerializer(serializers.ModelSerializer):
...
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)
Вы упомянули, что используете токен аутентификации. Попробуйте проверить в вашем представлении testDataApi
, правильно ли request.user
был установлен объект auth.User
. Попробуйте зарегистрировать его с помощью чего-то вроде следующего, чтобы убедиться, что он правильно установлен для пользователя для предоставленного токена:
@csrf_exempt
def testDataApi(request, id=0):
print(type(request.user), request.user) # Should display the user for the provided token.
...
Если он не установлен, то вам необходимо настроить, как он будет правильно отображать объект auth.User
из предоставленного токена. Возможно, вы захотите рассмотреть следующее:
- AuthenticationMiddleware - Устанавливает объект
request.user
. - AUTHENTICATION_BACKENDS - Пользовательская аутентификация токена и затем возвращает связанный
auth.User
объект .
- DEFAULT_AUTHENTICATION_CLASSES - Только при использовании
djangorestframework
. Устанавливает объектrequest.user
.- TokenAuthentication, JSONWebTokenAuthentication и т.д. - Только при использовании
djangorestframework
. Некоторые реализации аутентифицируют токены. Возможно, они были настроены неправильно.
- TokenAuthentication, JSONWebTokenAuthentication и т.д. - Только при использовании