如何使用Django rest API验证发布数据是否存在

wgeznvg7  于 2023-10-21  发布在  Go
关注(0)|答案(1)|浏览(131)

我有一个用Angular 9构建的前端和一个Django REST API来捕获订阅表单的电子邮件。
我会从前端验证条目,以确保它不存在于数据库中,然后才保存,如果它不存在。
下面是模型:

class Email(models.Model):
    email = models.EmailField(max_length=50)

    def __str__(self):
        return str(self.email)

视图集:

class EmailViewSet(viewsets.ModelViewSet):
    queryset = models.Email.objects.all() 
    serializer_class = serializers.EmailSerializer

    def create (self, request, *args, **kwargs):
        serializer = self.get_serializer(data=request.data)
        serializer.is_valid(raise_exception=True)
        self.perform_create(serializer)
        return Response(serializer.data,status=status.HTTP_201_CREATED)

    def perform_create(self,serializer):
        queryset = models.Email.objects.filter(email=request.data)
        if queryset.exists():
            raise ValidationError('Email exist!')
        serializer.save(email=request.data)
smdnsysy

smdnsysy1#

您可以简单地将email字段标记为**unique=True**[Django-doc]:

class Email(models.Model):
    email = models.EmailField(max_length=50, unique=True)

    def __str__(self):
        return self.email

Django REST框架中的序列化器将唯一性考虑在内,并将检查是否存在具有给定emailEmail。此外,唯一性也是在 * 数据库 * 级别强制执行的,因此通常情况下,如果数据库正常工作,则不可能创建具有相同email值的第二条记录。
在序列化程序中,可以使用以下命令指定错误消息:

from rest_framework import serializers

class EmailSerializer(ModelSerializer):
    email = serializers.EmailField(validators=[
        UniqueValidator(
            queryset=Email.objects.all(),
            message='Such email address already exists'
        )]
    )

    class Meta:
        model = Email
        fields = '__all__'

相关问题