Как создать ChoiceField для email пользователя из модели EmailAddress модели allauth в django restframework?

Я использую django allauth и restframework в бэкенде для API. Мой вопрос заключается в том, как я могу создать поле ChoiceField в моем сериализаторе с адресами электронной почты зарегистрированных пользователей в качестве значений, чтобы вместо текстового поля форма создавала поле Select для поля электронной почты.

На данный момент я создал AuthUserSerializer сериализатор для моего пользовательского API.

users/serializers.py

from rest_framework import serializers
from users.models import *

emails = [(email.email, email.email) for email in EmailAddress.objects.all()]

class AuthUserSerializer(serializers.ModelSerializer):
    email = serializers.ChoiceField(choices=emails)

    class Meta:
        model = User
        fields = ('id', 'username', 'first_name', 'last_name', 'email', 'avatar',
            'bio', 'country', 'is_staff', 'is_active', 'is_superuser', 'last_login',
            'date_joined')
        extra_kwargs = {
            'is_staff': { 'read_only': True },
            'is_superuser': { 'read_only': True },
            'last_login': { 'read_only': True },
            'date_joined': { 'read_only': True }
        }

I have initialized the email field as a ChoiceField in the above code and the choices are the emails got from the EmailAddress model.

Но я хочу получить электронные письма, созданные запрашиваемым пользователем. Я не знаю, как это сделать.

Я попробовал создать CustomChoiceField, как показано ниже, но оно все равно не работает.

class CustomChoiceField(serializers.ChoiceField):
    def __init__(self, **kwargs):
        user = self.context.get('request').user
        emails = [(email.email, email.email) for email in EmailAddress.objects.filter(user=user)]
        super().__init__(emails, **kwargs)

class AuthUserSerializer(serializers.ModelSerializer):
    email = ChoiceField()
    
    class Meta:
        model = User
        fields = ('id', 'username', 'first_name', 'last_name', 'email', 'avatar',
            'bio', 'country', 'is_staff', 'is_active', 'is_superuser', 'last_login',
            'date_joined')
        extra_kwargs = {
            'is_staff': { 'read_only': True },
            'is_superuser': { 'read_only': True },
            'last_login': { 'read_only': True },
            'date_joined': { 'read_only': True }
        }

users/views.py

from base.views import CustomModelViewSet
from users.models import *
 
class AuthUserViewset(CustomModelViewSet):
    serializer_class = AuthUserSerializer
    pagination_class = None

    def get_queryset(self):
        queryset = User.objects.filter(id=self.request.user.id)
        return queryset

Я не понимаю, что я делаю не так.

Поле выбора не является правильным вариантом. Django предоставляет поле Email в моделях. Используйте его и при вызове get api фильтруйте модель по идентификатору пользователя (если у пользователя может быть несколько адресов электронной почты, в противном случае вы также можете определить поле один-к-одному)

Ваша модель должна выглядеть следующим образом:

class AuthUserSerializer(serializers.ModelSerializer):
    email = models.EmailField()
    user = models.ForeignKey(model=UserModel, ...)
    class Meta:
        model = User
        fields = '__all__'

В случае, если вы используете email id один к одному:

Class UserModel:
    name = ...
    other_fields = ...
    email = ....

И примените фильтр в соответствии с вашими требованиями.

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