kzrfaisal
kzrfaisal

Reputation: 1443

Object of type 'AuthToken' is not JSON serializable

I'm getting the above error when creating token, here's the code:

from rest_framework import generics, permissions
from rest_framework.response import Response 
from knox.models import AuthToken
from .serializers import UserSerializer, RegisterSerializer

class RegisterAPI(generics.GenericAPIView):
    serializer_class = RegisterSerializer

def post(self, request, *args, **kwargs):
    serializer = self.get_serializer(data=request.data)
    serializer.is_valid(raise_exception=True)
    user = serializer.save()
    return Response({
        "user": UserSerializer(user, context=self.get_serializer_context()).data,
        "token": AuthToken.objects.create(user)
    })

what am I doing wrong here

Upvotes: 15

Views: 12962

Answers (4)

Gedeon Mutshipayi
Gedeon Mutshipayi

Reputation: 4073

If you're using Django rest framework auth token do this:

from rest_framework.authtoken.models import Token

...
# The token will be in token variable, created variable will be a bool
token, created = Token.objects.get_or_create(user=request.user)

# Object of type Token is not JSON serializable, so convert token to string
token = str(token)


Upvotes: 1

raven404
raven404

Reputation: 1197

This particular error occurs because the Token.objects.create returns a tuple (instance, token). just use the second position [1] by using instead of former

"token": AuthToken.objects.create(user)[1]

Upvotes: 1

Radesh
Radesh

Reputation: 13555

Better way is use this method in python

_, token = AuthToken.objects.create(user)
return Response({
    "user": UserSerializer(user, context=self.get_serializer_context()).data,
    "token": token
})

Upvotes: 15

Rasika Weragoda
Rasika Weragoda

Reputation: 984

The Token.objects.create returns a tuple (instance, token). So in order to get token use the index 1

"token": AuthToken.objects.create(user)[1]

Upvotes: 47

Related Questions