Django получает текущий email пользователя по умолчанию в другом сериализаторе на основе выбранного "userid"

Мне интересно, как правильно получить текущий email пользователя по умолчанию в другом сериализаторе на основе выбранного "userid". Я пробовал множество примеров из документации ModelSerializer, но безуспешно.

serializers.py

from rest_framework import serializers
from ticker.models import Ticker
from users.models import NewUser
from rest_framework.permissions import IsAuthenticated
from alerts.models import SectionAlerts
from users.serializers import UserlistSerializer
from rest_framework.fields import CurrentUserDefault

class TickerSerializer(serializers.ModelSerializer):
    class Meta:
        model = Ticker
        fields = "__all__"

class UserlistSerializer(serializers.ModelSerializer):
    class Meta:
        model = NewUser
        fields = "__all__"

class AlertsSerializer(serializers.ModelSerializer):
    ticker = TickerSerializer(read_only=True)
    email = UserlistSerializer(read_only=True)
    ticker_id = serializers.SlugRelatedField(
    queryset=Ticker.objects.all(), source="ticker", slug_field='crypto', write_only=True
    )
    class Meta:
        model = SectionAlerts
        fields = "__all__"

models.py

from django.db import models
from ticker.models import Ticker
from django.conf import settings
from import_export.resources import ModelResource
from import_export.fields import Field
from users.models import NewUser
from django.core.mail import EmailMessage

class SectionAlerts(models.Model):
    id = models.AutoField(primary_key=True)  # auto increment field
    valuenow = models.FloatField(null=True, blank=True, default=None)
    valuealarm = models.FloatField(null=True, blank=True, default=None)
    user = models.CharField(max_length = 40,blank=True, null=True)
    userid = models.ForeignKey(
        NewUser, related_name='userid', 
        blank=True,
        null=True,
        on_delete=models.CASCADE,
    )
    email = models.ForeignKey(NewUser, blank=True, null=True, on_delete=models.CASCADE)
    ticker = models.ForeignKey(Ticker, blank=True, null=True, on_delete=models.CASCADE)

DRF serializer

Вы можете использовать SerializerMethodField. Это позволит вам создать пользовательское поле в сериализаторе. По умолчанию SerializerMethodField ищет метод get_<field name>, и выполняет соответствующую логику:

from users.models import NewUser


class AlertsSerializer(serializers.ModelSerializer):
    ...
    email = serializers.SerializerMethodField()

    class Meta:
        model = SectionAlerts
        fields = "__all__"

    def get_email(self, obj):
        user_id = self.initial_data['userid']  # get the `userid` from the request body
        user = NewUser.objects.get(pk=user_id)  # fetch the user from DB
        return UserlistSerializer(instance=user).data

Вы не показываете модель NewUser, поэтому не уверены, какое именно поле вам нужно, но вы можете использовать точечную нотацию для source поля сериализатора.

Из документации DRF:

Имя атрибута, который будет использоваться для заполнения поля. Может быть методом, который принимает только аргумент self, например URLField(source='get_absolute_url'), или может использовать точечную нотацию для перехода к атрибутам, например EmailField(source='user.email').

>

См. этот раздел документации: https://www.django-rest-framework.org/api-guide/fields/#core-arguments

Вернуться на верх