Имя поля 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
Вернуться на верх