Как создать 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 = ....
И примените фильтр в соответствии с вашими требованиями.