Python Django {'user': [ErrorDetail(string='Неверный тип. Ожидаемое значение pk, получено BoundField.', code='incorrect_type')]}
Я разрабатываю свой бэкенд на Django. Я написал код для регистрации пользователей в классе RegistrationView, и он прекрасно работал до этого. Мне пришлось включить в него подтверждение по электронной почте, которое также прекрасно работало само по себе. Однако после того, как все это было сделано, я добавил некоторые условия, чтобы обеспечить правильную работу, но я получаю "string='Incorrect type. Ожидаемое значение pk, получено BoundField.'" и "Forbidden: /api/v1.0/user/register-patient/" ошибки.
Также, чтобы прояснить рабочий процесс. При регистрации каждому пользователю присваивается JWT-токен. Этот токен отличается от токена, отправляемого для верификации электронной почты. Я назвал последний "verification_token".
Итак, пользователь регистрируется, его поле 'is_active' устанавливается в False, пока он не нажмет на ссылку, полученную в письме. Для отправки письма использовался почтовый API Sendgrid. Письмо отправляется только в том случае, если данные patient_serializer хранятся в базе данных.
Когда пользователь нажимает на ссылку, полученную по электронной почте, его поле 'is_active' устанавливается в True, и теперь он может войти в систему.
Также, фактический ключ API sendgrid является частью кода, я удалил его здесь.
Мой файл models.py:
from django.db import models
from django.contrib.auth.models import User
class VerificatonToken(models.Model):
user = models.ForeignKey(
User, on_delete=models.CASCADE, related_name='token')
verification_token = models.CharField(
max_length=256, blank=True, null=True)
Мой файл serializers.py:
from rest_framework import serializers
from django.contrib.auth.models import User
from rest_framework.validators import UniqueValidator
from rest_framework_jwt.settings import api_settings
from .models import VerificatonToken
class TokenSerializer(serializers.ModelSerializer):
class Meta:
model = VerificatonToken
fields = ('user', 'verification_token',)
class PatientSerializer(serializers.ModelSerializer):
token = serializers.SerializerMethodField()
email = serializers.EmailField(
required=True,
validators=[UniqueValidator(queryset=User.objects.all())]
)
username = serializers.CharField(
required=True,
max_length=32,
validators=[UniqueValidator(queryset=User.objects.all())]
)
first_name = serializers.CharField(
required=True,
max_length=32
)
last_name = serializers.CharField(
required=True,
max_length=32
)
# DOB = serializers.DateField(
# required=True
# )
# gender = serializers.CharField(
# required=True
# )
# address = serializers.CharField(
# required=True,
# max_length=60
# )
# contactNo = serializers.IntegerField(
# required=True,
# max_length=11
# )
password = serializers.CharField(
required=True,
min_length=8,
write_only=True
)
def create(self, validated_data):
password = validated_data.pop('password', None)
instance = self.Meta.model(**validated_data)
if password is not None:
instance.set_password(password)
instance.save()
return instance
def get_token(self, obj):
jwt_payload_handler = api_settings.JWT_PAYLOAD_HANDLER
jwt_encode_handler = api_settings.JWT_ENCODE_HANDLER
payload = jwt_payload_handler(obj)
token = jwt_encode_handler(payload)
return token
class Meta:
model = User
fields = (
'token',
'username',
'password',
'first_name',
'last_name',
'email',
'is_active',
# 'DOB',
# 'address',
# 'contactNo',
'id'
)
Мой файл views.py:
Запрос почтальона:
Командная строка:
Я не могу понять, что пошло не так.