Создание профиля пользователя для пользователя auth django - PullRequest
0 голосов
/ 24 декабря 2018

Я пытаюсь создать профиль для своего пользователя, используя django rest auth model, но когда я отправляю данные для создания пользователя, изображение пользователя не заполняется, то есть становится нулевым, я пыталсядля отправки узла столько же, сколько image, столько же, сколько 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

сериализаторы \ 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')

сериализаторы \ 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)

1 Ответ

0 голосов
/ 25 декабря 2018

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

Теперь вы можете опубликовать свое поле изображения с остальнымипользовательские поля

...