Страница профиля Django не отображает информацию о связанном работнике с помощью Djoser
Я работаю над Django-приложением, в котором пользователи могут быть либо обычными пользователями приложения, либо рабочими с дополнительными данными. Я использую Djoser для аутентификации и регистрации пользователей. У меня возникли проблемы со страницей профиля, которая должна отображать информацию о пользователе и работнике, но она отображает только информацию о пользователе.
Вот краткий обзор моего кода:
#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',
},
}
Проблема:
Когда я делаю GET-запрос к api/v1/auth/users/me/, ответ содержит только информацию о пользователе (userInfo) и не включает связанную с ним информацию о работнике (workerInfo). Я проверил, что экземпляр рабочего существует и правильно связан с пользователем.
Взятые шаги:
Убедились, что для пользователя существует экземпляр Worker. Убедились, что запрос содержит действительный токен JWT. Проверьте отношения в базе данных, чтобы убедиться, что они правильно настроены.
Вопрос:
Что может быть причиной того, что workerInfo не отображается в ответе профиля, и как я могу решить эту проблему с помощью Djoser?
я нашел ответ в документации djoser Очевидно, я забыл добавить 'current_user' в настройках djoser добавив его:
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',
'current_user': 'base.serializers.CustomUserSerializer', ==> here
'user_delete': 'djoser.serializers.UserDeleteSerializer',
},
}
это сработало как шарм!!!