Как я могу обновить модель пользователя, расширенную через "OneToOneField" - PullRequest
1 голос
/ 17 февраля 2020

У меня есть некоторые проблемы с обновлением моей базы данных, в моем сериализаторе я использую расширенную пользовательскую модель OneToOneField django с двумя дополнительными полями с изображением пользователя и его девизом. Поэтому я думаю, что проблема с экземпляром в моем сериализаторе, но я не могу понять, как это сделать.

#core.models
class MangaUser(models.Model):
    user = models.OneToOneField(User, on_delete=models.CASCADE)
    user_image = models.ImageField(upload_to='upicks')
    user_motto = models.CharField(max_length=256)

#api.serializers
class UserSerializer(serializers.ModelSerializer):
    #mangauser_set = serializers.SerializerMethodField()
    user_image = serializers.ImageField(source='mangauser.user_image')
    user_moto = serializers.CharField(source='mangauser.user_motto')

    class Meta:
        model = User
        fields = ['id', 'username', 'email', 'password', 'user_image', 'user_motto']
        extra_kwargs = {'password': {'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 update(self, instance, validated_data):
        for attr, value in validated_data.items():
            if attr == 'password':
                instance.set_password(value)
            else:
                setattr(instance, attr, value)
        instance.save()
        return instance

#api.view
class GetUserInfo(APIView):

    permission_classes = (IsAuthenticated,)
    serializer_class = UserSerializer

    def get(self, request, *args, **kwargs):
        # serializer to handle turning our `User` object into something that
        # can be JSONified and sent to the client.
        serializer = self.serializer_class(request.user, context={"request":request})

        return Response(serializer.data, status=status.HTTP_200_OK)

    def put(self, request, *args, **kwargs):
        serializer = self.serializer_class(data=request.data, partial=True)
        serializer.is_valid(raise_exception=True)
        serializer.save()

        return Response(serializer.data, status=status.HTTP_200_OK)
#response
ValueError at /api/v1/userinfo/
Cannot assign "{'user_motto': 'js говно'}": "User.mangauser" must be a "MangaUser" instance.

1 Ответ

0 голосов
/ 17 февраля 2020

То, что вы сделали, мне кажется довольно сложным. Вы читали: https://docs.djangoproject.com/en/3.0/topics/auth/customizing/#extending модель существующего пользователя ?

Вот что я использую:

from django.contrib.auth.models import AbstractUser
class User(AbstractUser):
    def get_profile(self):
        return Profil.objects.get(user=self)
    class Meta(AbstractUser.Meta):
        db_table = 'auth_user'

class Profil (models.Model):
    user = models.OneToOneField (settings.AUTH_USER_MODEL, unique=True, editable=False, help_text="1-to-1 to user", on_delete=models.CASCADE)

    image_one = models.ImageField(upload_to="upload_to/images/", blank=True, null=True, help_text=_(u"Image qui sera accolée à votre profil."))

    class Meta:
        order_with_respect_to = 'user'
...