我有一个用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)
你可以简单地标记 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__'