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)
Вы можете использовать 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