这是一个用于注册用户的序列化器。
class RegisterSerializer(serializers.ModelSerializer):
class Meta:
model = User
fields = ('id', 'username', 'email', 'password')
extra_kwargs = {'password': {'write_only': True}}
def create(self, validated_data):
user = User.objects.create_user(validated_data['username'], validated_data['email'], validated_data['password'])
return user
这是 API View :
class RegisterView(generics.GenericAPIView):
serializer_class = RegisterSerializer
def post(self, request, *args, **kwargs):
serializer = self.get_serializer(data=request.data)
serializer.is_valid(raise_exception=True)
user = serializer.save()
return Response({
"user": UserSerializer(user, context=self.get_serializer_context()).data,
# "token": AuthToken.objects.create(user)[1]
})
在 api View 上,如果我尝试传入与现有名称完全相同的名称,它会说它已经存在。但是,我仍然可以将电子邮件设置为我不想要的相同。有没有办法获取它,以便我也可以告诉 DRF 我希望电子邮件也必须是唯一的?
最佳答案
有 2 个选项:
- 在序列化器级别强制执行唯一标准:
from rest_framework import serializers
from rest_framework.validators import UniqueValidator
class RegisterSerializer(serializers.ModelSerializer):
email = serializers.EmailField(
validators=[UniqueValidator(queryset=User.objects.all())]
) # recommend using `get_user_model`
class Meta:
model = User # recommend using `get_user_model`
...
...
- 使用在模型级别强制执行唯一标准的自定义用户模型。更多详情here :
from django.contrib.auth.models import AbstractUser
from django.db import models
class User(AbstractUser):
email = models.EmailField(unique=True)
注意:如果您直接在其他模型中引用 User
模型,第二个选项还需要更改设置以及可能的代码其他区域。如果您在代码的其他区域直接使用 User
,请查看使用 get_user_model
.
关于python - Django Rest Framework 指定电子邮件必须是唯一的,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/68027961/