I’m working on a Django application where users can be either normal app users or workers with additional details. I’m using Djoser for user authentication and registration. I’m having trouble with my profile page, which is supposed to display both user and worker information, but it only shows user information.
Here’s a brief overview of my code:
#models.py
from django.db import models
from django.contrib.auth.models import AbstractUser, PermissionsMixin
from django.utils.translation import gettext_lazy as _
from .managers import CustomUserManager
class User(AbstractUser, PermissionsMixin):
username = None
first_name = models.CharField(_('First name'), max_length=100)
last_name = models.CharField(_('last name'), max_length=100)
email = models.EmailField(_('Email Address'), max_length=254, unique=True)
is_staff = models.BooleanField(default=False)
is_active = models.BooleanField(default=False)
date_joined = models.DateTimeField(auto_now_add=True)
USERNAME_FIELD = "email"
REQUIRED_FIELDS = ["first_name", "last_name"]
objects = CustomUserManager()
class Meta:
verbose_name = _("User")
verbose_name_plural = _("Users")
def __str__(self):
return self.email
@property
def get_full_name(self):
return f"{self.first_name} {self.last_name}"
class Worker(models.Model):
user = models.OneToOneField(User, on_delete=models.CASCADE)
categories = models.ManyToManyField('Category', related_name='workers')
rating = models.DecimalField(max_digits=12, decimal_places=2, null=True, blank=True)
numReviews = models.IntegerField(null=True, blank=True, default=0)
pricePerHour = models.DecimalField(max_digits=12, decimal_places=2, null=True, blank=True)
gender_choices = [
('M', 'Male'),
('F', 'Female'),
]
gender = models.CharField(max_length=1, choices=gender_choices)
profile_photo = models.ImageField(upload_to='profile_photos/', null=True, blank=True)
num_tel = models.CharField(max_length=20)
small_description = models.TextField(null=True, blank=True)
description = models.TextField(null=True, blank=True)
_id = models.AutoField(primary_key=True, editable=False)
def __str__(self):
return f"{self.user.email} - {self.num_tel}"
#views.py
from django.contrib.auth import get_user_model
from rest_framework.serializers import ModelSerializer
from .models import Category, Worker
from djoser.serializers import UserCreateSerializer
from djoser.serializers import UserSerializer as DjoserUserSerializer
from rest_framework import serializers
User = get_user_model()
class UserSerializer(serializers.ModelSerializer):
class Meta:
model = User
fields = ['id', 'email', 'first_name', 'last_name']
class WorkerSerializer(serializers.ModelSerializer):
user = UserSerializer() # Serialize user details
class Meta:
model = Worker
fields = '__all__'
class CustomUserSerializer(DjoserUserSerializer):
worker = WorkerSerializer(read_only=True)
class Meta(DjoserUserSerializer.Meta):
model = User
fields = ['id', 'email', 'first_name', 'last_name', 'worker']
class CreateUserSerializer(UserCreateSerializer):
class Meta(UserCreateSerializer.Meta):
model = User
fields = ['id', 'email', 'first_name', 'last_name', 'password']
class CategorySerializer(ModelSerializer):
class Meta:
model = Category
fields = '__all__'
class ProvidersSerializer(ModelSerializer):
user = UserSerializer() # Include detailed user information
class Meta:
model = Worker
fields = '__all__'
#DJOSER SETTINGS:
DJOSER = {
'LOGIN_FIELD': 'email',
"USER_CREATE_PASSWORD_RETYPE": True,
"USERNAME_CHANGED_EMAIL_CONFIRMATION": True,
"PASSWORD_CHANGED_EMAIL_CONFIRMATION": True,
"SEND_CONFIRMATION_EMAIL": True,
"PASSWORD_RESET_CONFIRM_URL": "password/reset/confirm/{uid}/{token}",
"SET_PASSWORD_RETYPE": True,
"PASSWORD_RESET_CONFIRM_RETYPE": True,
'USERNAME_RESET_CONFIRM_URL': 'username/reset/confirm/{uid}/{token}',
'ACTIVATION_URL': 'activate/{uid}/{token}',
'SEND_ACTIVATION_EMAIL': True,
'SERIALIZERS': {
'user_create': 'base.serializers.CreateUserSerializer',
'user': 'base.serializers.CustomUserSerializer',
'user_delete': 'djoser.serializers.UserDeleteSerializer',
},
}
Problem:
When I make a GET request to api/v1/auth/users/me/, the response only includes the user information (userInfo) and does not include the related worker information (workerInfo). I have verified that the worker instance exists and is correctly associated with the user.
Steps Taken:
Verified that the Worker instance exists for the user.
Confirmed the request includes a valid JWT token.
Checked database relationships to ensure they are correctly set up.
Question:
What might be causing the workerInfo not to appear in the profile response, and how can I resolve this issue with Djoser?
Medyahya is a new contributor to this site. Take care in asking for clarification, commenting, and answering.
Check out our Code of Conduct.