Come creare un nuovo utente con django resto quadro e personalizzato utente modello

Ho un utente personalizzata modello e sto usando django-resto-framework per creare API

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)

Tuttavia, quando provo a creare un nuovo utente ricevo questo errore:

Avuto un TypeError quando si chiama User.objects.create(). Questo può essere perché si dispone di un scrivibile campo il serializzatore di classe che non è un argomento valido per User.objects.create(). Potrebbe essere necessario per rendere il campo di sola lettura, o di ignorare il UserSerializer.metodo create() per gestire correttamente questo.

Questo forse perché non c’è password1 o password2 campi del modello Utente. Ma è così, come posso creare un’API per la creazione di un nuovo utente usando django-resto-quadro?

InformationsquelleAutor Aamu | 2017-03-26

 

One Reply
  1. 30

    Penso che un campo password è sufficiente. Se si desidera controllare l’utente due volte la password di ingresso è lo stesso, è il front-end. È possibile eseguire l’override di un create metodo da serializzatore come riportato di seguito.

    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,)

Lascia un commento