DjangoRestFramework如何更新mod中的字段

2024-03-28 13:32:55 发布

您现在位置:Python中文网/ 问答频道 /正文

我使用的是Django用户模型,也为其他一些用户扩展了我自己的概要模型数据。什么时候我想更新配置文件模型中的用户数据,因为所有的用户id、用户名、电子邮件、密码都位于用户模型中,而需要更新的字段则位于配置文件模型中。我使用了这种方法,它所做的只是接受输入并显示响应,但在整体上查看用户数据时不会显示任何更改。在

模型.py

class Profile(models.Model):
    user = models.OneToOneField(User,related_name='profile',on_delete=models.CASCADE)
    location = models.CharField(max_length=30,blank=True)
    friends_count = models.PositiveIntegerField(default=0)
    profile_pic = models.FileField(upload_to='profile_pics/',blank=True,null=True)

    def natural_key(self):
        return (self.user.username,)

视图.py

^{pr2}$

网址.py

url(r'^user-update/(?P<pk>\d+)/$',views.UserUpdateAPI.as_view(),name="user-update"),
router = DefaultRouter()
router.register(r'profile',views.UserCreateAPIViewSet)

序列化程序.py

class UserProfileCreateSerializer(serializers.ModelSerializer):
    """"A serializer for user data request"""
    location = serializers.CharField(source='profile.location')
    friends_count = serializers.IntegerField(source='profile.friends_count',read_only=True)
    profile_pic = serializers.FileField(source='profile.profile_pic',allow_empty_file=True,allow_null=True)


    class Meta:
        model = User
        fields = (
            'pk',
            'username',
            'email',
            'password',
            'location',
            'friends_count',
            'profile_pic',
        )
        extra_kwargs = {
            'password':{'write_only':True},
            'friends_count':{'read_only':True},
        }

    def create(self, validated_data):
        """"Create and return a new User"""


        user = User(
            email = validated_data['email'],
            username = validated_data['username']
        )

        user.set_password(validated_data['password'])

        user.save()

        return user

class ProfileUpdateSerializer(serializers.ModelSerializer):
    """A serializer for updating user data"""
    class Meta:
        model = Profile
        fields = ('location','profile_pic')

Tags: 用户py模型truedatamodelscountlocation
1条回答
网友
1楼 · 发布于 2024-03-28 13:32:55

看起来您希望从AbstractBaseUser扩展(请参见下面的代码),将其用作您的UserProfileCreateSerializer

class UserProfileCreateSerializer(serializers.ModelSerializer):
    """"A serializer for user data request"""
    location = serializers.CharField(source='profile.location')
    friends_count = serializers.IntegerField(source='profile.friends_count',read_only=True)
    profile_pic = serializers.FileField(source='profile.profile_pic',allow_empty_file=True,allow_null=True)


    class Meta:
        model = Profile
        fields = (
            'pk',
            'username',
            'email',
            'password',
            'location',
            'friends_count',
            'profile_pic',
        )
        extra_kwargs = {
            'password':{'write_only':True},
            'friends_count':{'read_only':True},
        }

    def create(self, validated_data):
         """"Create and return a new User"""


        user = Profile(
             email = validated_data['email'],
             username = validated_data['username']
        )

        user.set_password(validated_data['password'])

        user.save()

        return user

class ProfileUpdateSerializer(serializers.ModelSerializer):
    """A serializer for updating user data"""
    class Meta:
        model = Profile
        fields = ('location','profile_pic')

然后从models.py中的AbstractBaseUser扩展:

^{pr2}$

然后在与models.py相同的目录中创建一个名为managers.py的文件:

from django.contrib.auth.base_user import BaseUserManager

class ProfileManager(BaseUserManager):
    use_in_migrations = True

    def _create_user(self, email, password, **extra_fields):
        """
        Creates and saves a User with the given email and password.
        """
        if not email:
            raise ValueError('The given email must be set')
        email = self.normalize_email(email)
        user = self.model(email=email, **extra_fields)
        user.set_password(password)
        user.save(using=self._db)
        return user

    def create_user(self, email, password=None, **extra_fields):
        extra_fields.setdefault('is_superuser', False)
        return self._create_user(email, password, **extra_fields)

    def create_superuser(self, email, password, **extra_fields):
        extra_fields.setdefault('is_superuser', True)

        if extra_fields.get('is_superuser') is not True:
            raise ValueError('Superuser must have is_superuser=True.')

        return self._create_user(email, password, **extra_fields)

要完成所有这些,您需要将其添加到settings.py文件中:

AUTH_USER_MODEL = 'app.Profile'

在使用$ python manage.py runserver之前,不要忘记重新运行所有数据库迁移。在

相关问题 更多 >