Django 个人资料页面未显示与 Djoser 相关的 Worker 信息

问题描述 投票:0回答:1

我正在开发一个 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',
    },  
}

问题:

当我向 api/v1/auth/users/me/ 发出 GET 请求时,响应中仅包含用户信息(userInfo),不包含相关的工作人员信息(workerInfo)。我已验证工作实例存在并且与用户正确关联。

采取的步骤:

验证用户的 Worker 实例是否存在。 已确认请求包含有效的 JWT 令牌。 检查数据库关系以确保它们设置正确。

问题:

可能导致workerInfo 未出现在个人资料响应中的原因是什么?如何使用 Djoser 解决此问题?

django django-models serialization djoser
1个回答
0
投票

我在 djoser 文档中找到了答案 显然我忘记在 djoser 设置中添加“current_user” 通过添加它:

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',
    },  
}

它就像一个魅力!

© www.soinside.com 2019 - 2024. All rights reserved.