web-dev-qa-db-ja.com

Django restフレームワークとカスタムユーザーモデルで新しいユーザーを作成する方法

カスタムユーザーモデルがあり、Django-rest-frameworkを使用して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)
_

ただし、新しいユーザーを作成しようとすると、次のエラーが表示されます。

User.objects.create()を呼び出すときにTypeErrorを取得しました。これは、シリアライザークラスにUser.objects.create()の有効な引数ではない書き込み可能なフィールドがあるためです。フィールドを読み取り専用にするか、UserSerializer.create()メソッドをオーバーライドしてこれを正しく処理する必要がある場合があります。

これはおそらく、Userモデルにpassword1またはpassword2フィールドがないためです。しかし、Django-rest-frameworkを使用して新しいユーザーを作成するAPIを作成するにはどうすればよいですか?

13
Aamu

1つのパスワードフィールドで十分だと思います。ユーザーの2回のパスワード入力が同じであることを確認する場合は、フロントエンドで実行します。次のように、シリアライザーからcreateメソッドをオーバーライドできます。

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