I am customizing a User from the AbstractBaseUser class and creating a registration view for it. I have created a serializer to process the data returned from the request body. Register still works normally and saves results to the database, and the registered account is still used normally. Although operating normally, the system reports:
AttributeError: Got AttributeError when attempting to get a value for field employee_id
on serializer UserSerializer
.
The serializer field might be named incorrectly and not match any attribute or key on the User
instance.
Original exception text was: ‘User’ object has no attribute ’employee_id’.
Model:
class Employee(models.Model):
class Meta:
db_table = 'Employee'
id = models.CharField(primary_key=True, default=uuid.uuid4, max_length=36)
image = models.ImageField(upload_to='employee_images/', null=True)
name = models.CharField(max_length=255)
citizen_id = models.CharField(max_length=100)
birthdate = models.DateTimeField()
appointment_date = models.DateTimeField()
class User(AbstractBaseUser):
class Meta:
db_table = 'Users'
id = models.CharField(primary_key=True, default=uuid.uuid4, max_length=36)
username = models.CharField(max_length=255, unique=True)
password = models.CharField(max_length=255)
role = models.ForeignKey('Role', on_delete=models.CASCADE, db_column='role_id')
objects = CustomUserManager()
REQUIRED_FIELDS = ['password', 'role']
USERNAME_FIELD = 'username'
class Role(models.Model):
class Meta:
db_table = 'Role'
id = models.CharField(primary_key=True, default=uuid.uuid4, max_length=36)
role = models.CharField(max_length=255)
class EmployeeRolePosition(models.Model):
class Meta:
db_table = 'EmployeeRolePosition'
unique_together = ('position', 'role', 'employee')
id = models.CharField(primary_key=True, default=uuid.uuid4, max_length=36)
position = models.ForeignKey(Position, on_delete=models.CASCADE)
role = models.ForeignKey(Role, on_delete=models.CASCADE)
employee = models.ForeignKey(Employee, on_delete=models.CASCADE)
assigned_at = models.DateTimeField()
CustomeUserManager
class CustomUserManager(BaseUserManager):
def create_user(self, username, password=None, role_id=None):
if not username:
raise ValueError('The Username field must be set')
if not password:
raise ValueError('The Password field must be set')
if not role_id:
raise ValueError('The Role field must be set')
user = self.model(
username=username,
role_id=role_id,
)
user.set_password(password)
user.save(using=self._db)
return user
Serializer
class UserSerializer(serializers.ModelSerializer):
employee_id = serializers.CharField()
class Meta:
model = User
fields = ['username', 'password', 'employee_id']
def create(self, validated_data):
id = validated_data.pop('employee_id')
role = get_object_or_404(EmployeeRolePosition, employee_id=id)
role_id = role.role_id
user = User.objects.create_user(role_id=role_id, **validated_data)
user.save()
return user
Views
class RegisterView(generics.CreateAPIView):
queryset = User.objects.all()
serializer_class = UserSerializer
def post(self, request, *args, **kwargs):
serializer = self.get_serializer(data=request.data)
if serializer.is_valid():
user = serializer.save()
refresh = RefreshToken.for_user(user)
return Response({
'user': serializer.data,
'refresh': str(refresh),
'access': str(refresh.access_token),
}, status=status.HTTP_201_CREATED)
return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST)
I have try everything I know :<