Я создаю API регистрации пользователей в DRF, используя модель профиля со связью OneToOne со стандартной моделью пользователя Django. Я создал сериализатор с моделью пользователя и определил поля профиля как поля сериализатора.
Проблема в том, что когда я публикую данные, хотя пользователь и профиль сохраняются в базе данных, которую я ' получаю эту ошибку
error AttributeError at /auth/registration Got AttributeError when attempting to get a value for field address on serializer UserRegistrationSerializer. The serializer field might be named incorrectly and not match any attribute or key on the User instance. Original exception text was: 'User' object has no attribute 'address'.
использование write_only с адресом, кажется, решает проблему, но я хочу понять, почему это происходит и как это представление обращается к этому полю адреса, почему это происходит игнорирует номер телефона и дату_рождения и не выдает по ним ошибок. Любой вклад будет полезен. Спасибо!
Вот мой код для модели, сериализатора и представления.
#models.py
class Profile(models.Model):
user = models.OneToOneField(User, on_delete=models.CASCADE)
date_of_birth = models.DateField(null=True)
phone_number = models.CharField(null=True, max_length=30)
address = models.CharField(max_length=250)
def __str__(self):
return f'Profile of {self.user.username}'
#Serializer.py
class UserRegistrationSerializer(serializers.ModelSerializer):
phone_number = serializers.CharField(required=False, max_length=30)
date_of_birth = serializers.DateField(required=False)
address = serializers.CharField(max_length=250)
password = serializers.CharField(write_only=True)
password2 = serializers.CharField(write_only=True, label = 'Confirm Password')
class Meta:
model = User
fields = ['username', 'first_name', 'last_name', 'email', 'phone_number', 'date_of_birth', 'address', 'password', 'password2']
def create(self, validated_data):
phone_number = validated_data.pop('phone_number', None)
date_of_birth = validated_data.pop('date_of_birth', None)
address = validated_data.pop('address', None)
password = validated_data.pop('password', None)
first_name = validated_data.pop('first_name', None)
last_name = validated_data.pop('last_name', None)
user = User (
username = validated_data['username'],
email = validated_data['email'],
first_name = first_name,
last_name = last_name
)
user.set_password(password)
user.save()
Profile.objects.create(
user=user,
date_of_birth=date_of_birth,
address=address,
phone_number=phone_number
)
return user
#view.py
class UserRegistrationView(generics.CreateAPIView):
serializer_class = UserRegistrationSerializer
queryset = User.objects.all()
Подробнее здесь: https://stackoverflow.com/questions/789 ... -post-data