wake-up-neo.com

So erstellen Sie einen neuen Benutzer mit Django Rest Framework und benutzerdefiniertem Benutzermodell

Ich habe ein benutzerdefiniertes Benutzermodell und verwende das Django-Rest-Framework, um eine API zu erstellen

models.py:

class User(AbstractBaseUser, PermissionsMixin):
    email = models.EmailField(
        unique=True,
        max_length=254,
    )
    first_name = models.CharField(max_length=15)
    last_name = models.CharField(max_length=15)
    mobile = models.IntegerField(unique=True)
    date_joined = models.DateTimeField(default=timezone.now)
    is_active = models.BooleanField(default=True)
    is_admin = models.BooleanField(default=False)

serializers.py:

class UserSerializer(serializers.ModelSerializer):
    password1 = serializers.CharField(write_only=True)
    password2 = serializers.CharField(write_only=True)

    class Meta:
        model = User
        fields = ('first_name', 'last_name', 'email', 'mobile', 'password1', 'password2')

views.py:

@api_view(['POST'])
@permission_classes((AllowAny,))
def create_user(request):
    serialized = UserSerializer(data=request.data)
    if serialized.is_valid():
        User.objects.create_user(
            serialized.save()
        )
        return Response(serialized.data, status=status.HTTP_201_CREATED)
    else:
        return Response(serialized._errors, status=status.HTTP_400_BAD_REQUEST)

Wenn ich jedoch versuche, einen neuen Benutzer zu erstellen, wird folgende Fehlermeldung angezeigt:

Beim Aufrufen von User.objects.create() wurde ein TypeError angezeigt. Dies kann daran liegen, dass Sie ein beschreibbares Feld in der Serializer-Klasse haben, das kein gültiges Argument für User.objects.create() ist. Möglicherweise müssen Sie das Feld schreibgeschützt machen oder die UserSerializer.create () -Methode überschreiben, um dies korrekt zu behandeln.

Dies liegt möglicherweise daran, dass das Benutzermodell keine Felder für Kennwort1 oder Kennwort2 enthält. Aber wie kann ich eine API erstellen, um mithilfe des Django-Rest-Frameworks einen neuen Benutzer zu erstellen?

22
Aamu

Ich denke ein Passwortfeld ist genug. Wenn Sie überprüfen möchten, ob die zweimalige Passworteingabe des Benutzers identisch ist, führen Sie dies im Front-End aus. Sie können eine create -Methode aus dem Serializer wie folgt überschreiben.

from rest_framework import serializers

class UserSerializer(serializers.ModelSerializer):
    password = serializers.CharField(write_only=True)

    class Meta:
        model = User
        fields = ('first_name', 'last_name', 'email', 'mobile', 'password')

    def create(self, validated_data):
        user = super(UserSerializer, self).create(validated_data)
        user.set_password(validated_data['password'])
        user.save()
        return user

views.py

from rest_framework import generics
from rest_framework.permissions import AllowAny
from .models import User
from .serializers import UserSerializer

class UserCreateAPIView(generics.CreateAPIView):
    queryset = User.objects.all()
    serializer_class = UserSerializer
    permission_classes = (AllowAny,)
37
Xiao