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

标签 python django django-rest-framework postman

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

enter image description here

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

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

关于python - 为用户 auth django 创建用户配置文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53916021/

相关文章:

python - 如何在 Windows 10 上从 Anaconda 卸载 pip opencv-python?

python - Eclipse 中的 HTML/CSS/JS 语法高亮显示

python - 在 django 模板中显示单个表单字段?

python - "Not a valid string."- 尝试将 dict 保存到 Django Rest Framework 中的 TextField 时出错

python - Django/Django Rest Framework - 禁用 CSRF

python - 如何使用 Django 1.5 创建自定义用户配置文件?

python - 在 Python 中将字符串组合到数据框中的列表

python - 找不到 Django 图像

python - 连接到服务器上运行的 virtualenv/django 时如何解决 ERR_CONNECTION_REFUSED

django - 在Serializer Django中获取外键关系的数据:Rest Framework