如何 return 电子邮件与用户端点一起验证?
How to return email verified along with user endpoint?
我已经实施了 DRF,不想强制进行电子邮件验证,但仍然使用它(在屏幕上提醒他们)。我只想 return account_emailaddress.verified 以及用户端点。实现这一目标的最佳方法是什么?我尝试从中获取提示 ,但没有成功。
account_emailaddress来自我实现的django-allauth应用
https://github.com/pennersr/django-allauth/blob/master/allauth/account/models.py
序列化器:
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
)
编辑:感谢 schillingt 的回答,我能够修改序列化程序以按需要工作
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
如果我只想要不同序列化程序上的字段,我过去的做法是使用 SerializerMethod
class。我猜 class 对应 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
然后在视图集上,您应该在 queryset
属性 的 select_related
中包含 account_emailaddress
,这样它就不会为每个 CustomUser
.
您可以在序列化程序字段上使用源映射来包含来自相关模型的字段,就像这样(假设已验证是一个布尔字段);
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 模型上的一个字段,或者可以通过 OneToOne 字段像 custom_user.account_emailaddress 一样访问。
我已经实施了 DRF,不想强制进行电子邮件验证,但仍然使用它(在屏幕上提醒他们)。我只想 return account_emailaddress.verified 以及用户端点。实现这一目标的最佳方法是什么?我尝试从中获取提示
account_emailaddress来自我实现的django-allauth应用 https://github.com/pennersr/django-allauth/blob/master/allauth/account/models.py
序列化器:
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
)
编辑:感谢 schillingt 的回答,我能够修改序列化程序以按需要工作
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
如果我只想要不同序列化程序上的字段,我过去的做法是使用 SerializerMethod
class。我猜 class 对应 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
然后在视图集上,您应该在 queryset
属性 的 select_related
中包含 account_emailaddress
,这样它就不会为每个 CustomUser
.
您可以在序列化程序字段上使用源映射来包含来自相关模型的字段,就像这样(假设已验证是一个布尔字段);
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 模型上的一个字段,或者可以通过 OneToOne 字段像 custom_user.account_emailaddress 一样访问。