python - 如何更新通过 "OneToOneField"扩展的用户模型

标签 python django django-rest-framework

我在更新数据库时遇到一些问题,在我的序列化器中,我使用通过 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.

最佳答案

你所做的事情对我来说似乎相当复杂。 您读过吗:https://docs.djangoproject.com/en/3.0/topics/auth/customizing/#extending-the-existing-user-model

这就是我使用的:

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'

关于python - 如何更新通过 "OneToOneField"扩展的用户模型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60254808/

相关文章:

Django - DRF 删除/检索/补丁返回 404 { 详细信息 : "Not found" }

python - 基于多个条件创建 Pandas Dataframe 列

python - Django 清理密码 'ValidationError' 对象没有属性 'get'

python - 使用 Pandas 从遥测数据中识别停靠点

javascript - 在 Django 中将总计行与表排序器分开

python - 覆盖 Django RF 中的序列化程序删除方法

django - 使用 django Rest 框架登录

python - 使用 django-filter,有没有一种快速的方法来支持所有可能的字段查找?

django - Heroku Postgres 中的权限错误

python - 如何验证 DRF 中的更新字段?