Как вернуть подтвержденный адрес электронной почты вместе с конечной точкой пользователя? - PullRequest
0 голосов
/ 01 ноября 2018

Я внедрил DRF и не хочу принудительно проверять электронную почту, но все еще использую его (напомните им на экране). Я хотел бы просто вернуть account_emailaddress.verified вместе с конечной точкой пользователя. Каков наилучший способ достичь этого? Я пытался получить подсказки из этого сообщения , но безуспешно.

account_emailaddress происходит из приложения django-allauth, которое я реализовал https://github.com/pennersr/django-allauth/blob/master/allauth/account/models.py

Serializer:

class UserSerializer(serializers.ModelSerializer):
class Meta:
    model = models.CustomUser
    fields = ('id', 'first_name', 'last_name', 'email', 'phone_number', 'avatar')

Вид:

class UserView(generics.RetrieveUpdateDestroyAPIView):
queryset = CustomUser.objects.all()
serializer_class = UserSerializer

def get(self, request, *args, **kwargs):
    try:
        user = self.queryset.get(pk=kwargs["user"])
        return Response(UserSerializer(user).data)
    except CustomUser.DoesNotExist:
        return Response(
            data={
                "message": "User with id: {} does not exist".format(kwargs["user"])
            },
            status=status.HTTP_404_NOT_FOUND
        )

def put(self, request, *args, **kwargs):
    try:
        user = self.queryset.get(pk=kwargs["user"])
        serializer = UserSerializer()
        user = serializer.update(user, request.data)
        return Response(UserSerializer(user).data)
    except CustomUser.DoesNotExist:
        return Response(
            data={
                "message": "User with id: {} does not exist".format(kwargs["user"])
            },
            status=status.HTTP_404_NOT_FOUND
        )

Редактировать: Благодаря ответу Шиллингта я смог изменить сериализатор так, чтобы он работал как нужно

from allauth.account.models import EmailAddress    

class UserSerializer(serializers.ModelSerializer):
verified_email = serializers.SerializerMethodField()
class Meta:
    model = models.CustomUser
    fields = ('id', 'first_name', 'last_name', 'email', 'phone_number', 'avatar', 'verified_email')

def get_verified_email(self, obj):
    try:
        email_address = EmailAddress.objects.get(user_id=obj.id)
        return email_address.verified
    except EmailAddress.DoesNotExist:
        return None

Ответы [ 2 ]

0 голосов
/ 01 ноября 2018

Вы можете использовать сопоставление источника в поле сериализатора, чтобы включить поля из связанной модели, например, так (при условии, что проверено логическое поле);

class UserSerializer(serializers.ModelSerializer):
    verified = serializers.BooleanField(source='account_emailaddress.verified', read_only=True)

class Meta:
    model = models.CustomUser
    fields = ('id', 'first_name', 'last_name', 'email', 'phone_number', 'avatar', 'verified ')

Обратите внимание, что это также предполагает, что account_emailaddress является полем в модели CustomUser или может быть доступно как custom_user.account_emailaddress через поле OneToOne.

0 голосов
/ 01 ноября 2018

Если я просто хочу, чтобы поле на другом сериализаторе использовалось в прошлом, я использовал класс SerializerMethod. Я угадал в классе за account_emailaddress.

class UserSerializer(serializers.ModelSerializer):
    verified_email = serializers.SerializerMethod()

    class Meta:
        model = models.CustomUser
        fields = (..., 'verified_email')

    def _verified_email(self, obj):
        try:
            return obj.account_emailaddress.verified
        except EmailAddress.DoesNotExist:
            return None

Затем в наборе необходимо включить account_emailaddress в select_related свойства queryset, чтобы он не делал дополнительный запрос для CustomUser.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...