#Users not getting saved in database

23 messages · Page 1 of 1 (latest)

fossil sinew
#

this the whole code for authentication I dont know why why the users i create does not get stored in the database when i create them using api urls, when I try using shell and use Users.objects.all(), it just shows empty json

serializers.py

from django.contrib.auth.models import User
from rest_framework import serializers

class RegisterSerializer(serializers.Serializer):
    username=serializers.CharField()
    password=serializers.CharField()

    def validate(self,data):
        if data['username']:
            if User.objects.filter(username=data['username']).exists():
                raise serializers.ValidationError("Username already exists")
            
        return data
    
    def create(self, validated_data):
        user=User.objects.create_user(username=validated_data['username'],password=validated_data['password'])
        user.save()

        return user
    

class LoginSerializer(serializers.Serializer):
    username=serializers.CharField()
    password=serializers.CharField()
#

views.py

from django.contrib.auth.models import User
from rest_framework import generics, permissions
from rest_framework.views import APIView
from rest_framework.response import Response
from .serializers import RegisterSerializer, LoginSerializer
from django.contrib.auth import authenticate,get_user_model
from rest_framework.authtoken.models import Token

User=get_user_model()

class RegisterView(APIView):
    def post(self,request):
        data=request.data
        serializer=RegisterSerializer(data=data)

        if not serializer.is_valid():
            return Response(
                {
                    'status':'False',
                    'message':serializer.errors
                }
            )
        serializer.save()
        return Response({'message':'User account created'})
    

class LoginView(APIView):

    def post(self , request):
        data = request.data
        serializer = LoginSerializer(data=data)

        if not serializer.is_valid():
            return Response({
                'status':False,
                'message':serializer.errors
            }) 

        user = authenticate(username = serializer.data['username'] , password = serializer.data['password'])

        if not user:
            return Response({
                'status':False,
                'message': 'invalid credentials'
            })
        
        token, created = Token.objects.get_or_create(user=user)
        if created:
            token.save()

        return Response({'message':"user login" , 'token':str(token)})

from django.urls import path
from .views import RegisterView, LoginView

urlpatterns = [
    path('register/', RegisterView.as_view(), name='signup'),
    path('login/', LoginView.as_view(), name='login'),
]
hardy pecan
#

What response does the RegisterView generate?

fossil sinew
#

10 mins

fossil sinew
hardy pecan
#

Add a print statement to that view:

        instance = serializer.save() # save instance in a variable here
        print(instance)
        return Response({'message':'User account created'})
fossil sinew
#

Ok

hardy pecan
#

Does that print something, anything?

desert dagger
#

Do you have a custom manager for this User Model?

fossil sinew
fossil sinew
desert dagger
#

Okay

fossil sinew
# hardy pecan Does that print something, anything?

hey thanks for your tip, I just came to know when I am running the server on localhost and if I create any user then its getting stored in database but when I am running the api in deployed server i.e on render then if I create any user then its not getting stored in database, any solution for this?

hardy pecan
#

Though I am not familiar with render.

fossil sinew
hardy pecan
#

What DB do you use?

#

SQLite? Postgres?

desert dagger
#
# models.py
from django.contrib.auth.models import AbstractUser, BaseUserManager, PermissionsMixin


class CustomUserManager(BaseUserManager):

    def create_user(self, username, email=None, password=None, **extra_fields):
        instance = self.create(username=username)
        instance.set_password(password)
        instance.save(using=self._db)
        return instance


class CustomUser(AbstractUser,PermissionsMixin):

    def __str__(self):
        return f"{self.username}"

    objects = CustomUserManager()

# serializers.py 
from .models import CustomUser
from rest_framework import serializers
from rest_framework.exceptions import ValidationError


class UserSerializer(serializers.ModelSerializer):
    username = serializers.CharField(max_length=32)
    password = serializers.CharField(max_length=64)

    def validate(self, attrs):
        if not hasattr(attrs,'username') and hasattr(attrs,'password'):
            return ValidationError("Invalid data")

        return attrs

    def create(self, validated_data):
        return CustomUser.objects.create_user(username=validated_data['username'], password=validated_data['password'])

    class Meta:
        model = CustomUser
        fields = [
            'username',
            'password'
        ]

#

This method allows you to save your model objects using serializer. here's the ouput from console.

#

from users.serializers import UserSerializer

from users.models import CustomUser
data = {'username':'Kakashi Sensei', 'password':'kakashi@123'}
obj = UserSerializer(data=data)
obj.is_valid()
True
obj.save()
<CustomUser: Kakashi Sensei>
CustomUser.objects.all()
<QuerySet [<CustomUser: Kakashi Sensei>]>
obj.data
{'username': 'Kakashi Sensei', 'password': 'pbkdf2_sha256$600000$EF8ck4UgYVQ2dnwAuuFIdc$iro6W/PG6FWZpdylcI1ClPVF8AawPoWzyZvx+DzZG3w='}

fossil sinew