python - Django Rest Framework 指定电子邮件必须是唯一的

标签 python django django-rest-framework

这是一个用于注册用户的序列化器。

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 个选项:

  1. 在序列化器级别强制执行唯一标准:
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/

    相关文章:

    Django-Haystack 使用带有 IAM 凭证的 Amazon Elasticsearch 托管

    javascript - 强制元素具有相同的边界(单独的内联 block / float :left; clear:right doesn't work)

    python - 带有额外字段的 Django Rest Framework 用户注册

    python - 统计模型 API : SARIMAX function missing

    django - Django LiveServerTestCase、Selenium 和 Postgres 的间歇性死锁

    python - 读取文本文件 - for 循环给出意外的输出

    docker - 如何在 Docker 中为多个微服务创建集中式身份验证服务器

    Mysql 连接过多 : Django sqlAlchemy

    python - Scrapy start_urls

    python - PyTorch:如何将张量的形状作为 int 列表