如何用Django rest api验证帖子数据是否存在?

问题描述 投票:1回答:1

我有一个用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)
django django-models django-rest-framework
1个回答
1
投票

你可以简单地标记 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框架中的序列化器将uniqness考虑在内,并将检查是否有一个 Email 与给定 email 已经存在。此外,独一性也被强制执行在。数据库 级别,所以通常情况下,如果数据库工作正常,是不可能创建第二条具有相同的 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__'
© www.soinside.com 2019 - 2024. All rights reserved.