Skip to main content
 首页 » 编程设计

python之为用户 auth django 创建用户配置文件

2024年09月03日36开发

我正在尝试使用 django rest auth 模型为我的用户创建一个配置文件,但是当我将数据发送到用户的创建时,用户的图像没有被填充,也就是说,它变得空了,我试过了将节点发送尽可能多的图像,尽可能多的 profile.image,但在我的代码下面没有成功:

models\profile.py

from django.conf import settings 
from django.db import models 
 
 
class Profile(models.Model): 
    image = models.ImageField(blank=True) 
    user = models.OneToOneField(settings.AUTH_USER_MODEL, on_delete=models.CASCADE) 
 
    def __str__(self): 
        return self.user.email 

serializers\user.py

from rest_framework import serializers 
from rest_framework.validators import UniqueValidator 
from django.contrib.auth.models import User 
from src.v1.user.models.profile import Profile 
from .profile import ProfileSerializer 
 
 
class UserSerializer(serializers.ModelSerializer): 
    profile = serializers.SerializerMethodField() 
    email = serializers.EmailField( 
        required=True, 
        validators=[UniqueValidator(queryset=User.objects.all())] 
    ) 
    username = serializers.CharField( 
        max_length=32, 
        validators=[UniqueValidator(queryset=User.objects.all())] 
    ) 
    password = serializers.CharField(min_length=6, write_only=True) 
 
    @staticmethod 
    def get_profile(user): 
        """ 
        Get or create profile 
        """ 
 
        profile, created = Profile.objects.get_or_create(user=user) 
        return ProfileSerializer(profile, read_only=True).data 
 
    def create(self, validated_data): 
        user = User(email=validated_data['email'], 
                    username=validated_data['username']) 
        user.set_password(validated_data['password']) 
        user.save() 
        return user 
 
    class Meta: 
        model = User 
        fields = ('id', 'username', 'email', 'password', 'profile') 

serializers\profile.py

from rest_framework import serializers 
from src.v1.user.models.profile import Profile 
 
 
class ProfileSerializer(serializers.ModelSerializer): 
 
    class Meta: 
        model = Profile 
        fields = '__all__' 
 
 
class ProfileSerializerUpdate(serializers.ModelSerializer): 
 
    class Meta: 
        model = Profile 
        fields = ('image',) 

views\user.py

from rest_framework.views import APIView 
from rest_framework.response import Response 
from rest_framework import status 
from src.v1.user.serializers.user import UserSerializer 
from rest_framework.authtoken.models import Token 
 
 
class UserView(APIView): 
    """ 
    Creates the user. 
    """ 
 
    def post(self, request): 
        serializer = UserSerializer(data=request.data) 
        if serializer.is_valid(): 
            user = serializer.save() 
            if user: 
                token = Token.objects.create(user=user) 
                json = serializer.data 
                json['token'] = token.key 
                return Response(json, status=status.HTTP_201_CREATED) 
 
        return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST) 

请您参考如下方法:

SerializerMethodField 设计为只读。因此,不仅仅是图片,个人资料上没有发布任何内容。

此外,如果配置文件在 GET 请求期间不存在,则创建该配置文件是一个糟糕的设计,因为一般来说,GET 请求应该是安全的,并且不会改变应用程序的状态。

您应该改为在创建用户期间创建配置文件。由于配置文件中只有一个字段要发布,因此对发布数据使用平面表示可能更简单、更有效。

这是你应该做的。

serializers/user.py

class UserSerializer(serializers.ModelSerializer): 
    profile = ProfileSerializer(read_only=True) 
    image = serializers.ImageField(write_only=True) 
 
    email = serializers.EmailField( 
        required=True, 
        validators=[UniqueValidator(queryset=User.objects.all())] 
    ) 
 
    username = serializers.CharField( 
        max_length=32, 
        validators=[UniqueValidator(queryset=User.objects.all())] 
    ) 
 
    password = serializers.CharField(min_length=6, write_only=True) 
 
    def create(self, validated_data): 
        user = User(email=validated_data['email'], username=validated_data['username']) 
        user.set_password(validated_data['password']) 
        user.save() 
        Profile.objects.create(user=user, image=validated_data['image') 
        return user 

现在您可以将您的图像字段与其他用户字段一起发布