カスタムユーザーモデルがあり、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を作成するにはどうすればよいですか?
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,)