I think you have a few errors in your code.
In views.py you write:
User.objects.create_user(
serialized.save()
)
serialized.save() is probably calling User.objects.create - which you
shouldn't do. If you want to create a user the way you are doing you will
need to override the default create_user method on the User model. Add
support for handling the password1 and password2 fields and then add
support for the first_name and last_name fields.
Then you can override the create method on the serializer class like this:
def create(self, validated_data):
"""
Override default implementation of the create method. Make sure
user gets password.
:param validated_data: the validated data sent to the method
:return: the newly created user if successful
"""
if self.is_valid(True):
return User.create_user(validated_data.get("email"),
validated_data.get("password"),
validated_data.get("first_name"),
validated_data.get("last_name"))
Regards,
Andréas
2017-03-26 18:23 GMT+02:00 Aamu Padi <[email protected]>:
> I have a custom user model and I am using django-rest-framework to create
> 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)
>
>
> However, when I try to create a new user I am getting this error:
>
> *Got a TypeError when calling User.objects.create(). This may be because
>> you have a writable field on the serializer class that is not a valid
>> argument to User.objects.create(). You may need to make the field
>> read-only, or override the UserSerializer.create() method to handle this
>> correctly.*
>
>
> This maybe because there's no password1 or password2 fields in the User
> model. But so, how can I create an API to create a new user using
> django-rest-framework?
>
> --
> You received this message because you are subscribed to the Google Groups
> "Django users" group.
> To unsubscribe from this group and stop receiving emails from it, send an
> email to [email protected].
> To post to this group, send email to [email protected].
> Visit this group at https://groups.google.com/group/django-users.
> To view this discussion on the web visit https://groups.google.com/d/
> msgid/django-users/CAHSNPWtWmifpo6BuWQmp3-Y-pXyJAPBELf90MmeWLQBB9nGmyw%
> 40mail.gmail.com
> <https://groups.google.com/d/msgid/django-users/CAHSNPWtWmifpo6BuWQmp3-Y-pXyJAPBELf90MmeWLQBB9nGmyw%40mail.gmail.com?utm_medium=email&utm_source=footer>
> .
> For more options, visit https://groups.google.com/d/optout.
>
--
You received this message because you are subscribed to the Google Groups
"Django users" group.
To unsubscribe from this group and stop receiving emails from it, send an email
to [email protected].
To post to this group, send email to [email protected].
Visit this group at https://groups.google.com/group/django-users.
To view this discussion on the web visit
https://groups.google.com/d/msgid/django-users/CAK4qSCe5CqajAZs7wOdoRh7-yzj%3DZVxXpbDRas3znndubymddA%40mail.gmail.com.
For more options, visit https://groups.google.com/d/optout.