Имя поля city недопустимо для модели user Ошибка Django
Я получаю сообщение об ошибке: Field name 'city' is not valid for model 'User'. когда я посещаю конечную точку: http://127.0.0.1:8000/update_profile/
Вот мой urls.py:
urlpatterns = [
path('', include(router.urls)),
path('admin/', admin.site.urls),
path('api-auth/', include('rest_framework.urls', namespace='rest_framework')),
path('api/token/', CustomTokenObtainPairView.as_view(), name='token_obtain_pair'),
path('api/token/refresh/', TokenRefreshView.as_view(), name='token_refresh'),
path('api/token/verify/', TokenVerifyView.as_view(), name='token_verify'),
path('api/register', RegisterApi.as_view()),
path('update_profile/', views.UpdateProfileView.as_view(), name='update_profile'),
] + static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT)
Вот мой UpdateProfileView
class UpdateProfileView(generics.UpdateAPIView):
queryset = User.objects.all()
serializer_class = UpdateUserSerializer
Я расширил свой класс пользователя, чтобы включить другие поля в модели:
class Profile(models.Model):
user = models.OneToOneField(User, on_delete=models.CASCADE)
city = models.CharField(max_length=50,blank=True)
country = models.CharField(max_length=50, blank=True)
bio = models.CharField(max_length=500, blank=True)
profile_pic = models.ImageField(upload_to='profile/%Y/%m/%d', default='media/placeholder.png', blank=False, null=False)
#we are hooking create_user_profile and save_user profile methods to the User model whenever a save event occurs. This kind of signal is called post_save
@receiver(post_save, sender=User)
def create_user_profile(sender, instance, created, **kwargs):
if created:
Profile.objects.create(user=instance)
@receiver(post_save, sender=User)
def save_user_profile(sender, instance, **kwargs):
instance.profile.save()
<
class RegisterSerializer(serializers.ModelSerializer):
class Meta:
model = User
#removed url from fields
fields = ['username', 'email', 'password', 'first_name', 'last_name', 'city', 'country', 'bio']
extra_kwargs = {
'password': {'write_only': True},
}
def create(self,validated_data):
user = User.objects.create_user(
username=validated_data['username'],
first_name=validated_data['first_name'],
last_name=validated_data['last_name'],
city=validated_data['city'],
country=validated_data['country'],
bio=validated_data['bio'],
email=validated_data['email']),
user.set_password(validated_data['password'])
user.save()
return user
#updating user profile
class UpdateUserSerializer(serializers.ModelSerializer):
email = serializers.EmailField(required=True)
class Meta:
model = User
fields = ['username', 'email', 'password', 'first_name', 'last_name', 'city', 'country', 'bio']
def validate_email(self, value):
user = self.context['request'].user
if User.objects.exclude(pk=user.pk).filter(email=value).exists():
raise serializers.ValidationError({"email": "This email is already in use."})
return value
def validate_username(self, value):
user = self.context['request'].user
if User.objects.exclude(pk=user.pk).filter(username=value).exists():
raise serializers.ValidationError({"username": "This username is already in use."})
return value
def update(self, instance, validated_data):
user = self.context['request'].user
if user.pk != instance.pk:
raise serializers.ValidationError({"authorize": "You don't have permission for this user."})
instance.first_name = validated_data['first_name']
instance.last_name = validated_data['last_name']
instance.email = validated_data['email']
instance.username = validated_data['username']
instance.city = validated_data['city']
instance.country = validated_data['country']
instance.bio = validated_data['bio']
instance.save()
return instance
Ваша проблема в том, что city не является допустимым полем для User, поскольку вы добавили это поле в модель Profile. То же самое происходит для country, bio и profile_pic.
Вы можете попробовать следующее:
def create(self, validated_data):
user = User.objects.create_user(
username=validated_data['username'],
first_name=validated_data['first_name'],
last_name=validated_data['last_name'],
email=validated_data['email'])
user.set_password(validated_data['password'])
user.save()
# Assuming now that your profile is created
user.profile.city = validated_data['city']
user.profile.country = validated_data['country']
user.profile.bio = validated_data['bio']
user.profile.save()
return user