<p>您不能使用<code>raise <s>email.</s>ValidationError(…)</code><code>email</code>是一个<code>str</code>字符串,字符串没有<code>ValidationError</code>属性。它也是非感官的,因为变量email不包含单词email</p>
<p>您的用户名也没有验证:这是由序列化程序完成的,序列化程序只是在这方面出错,因为<code>User</code>模型的<code>username</code>字段要求<code>username</code>是唯一的。因此,序列化程序将对此进行验证</p>
<h2>选项1:由序列化程序进行验证</h2>
<p>您还可以为电子邮件实现逻辑。例如,通过定义您自己的模型,或通过向电子邮件序列化字段添加<a href="https://www.django-rest-framework.org/api-guide/validators/#uniquevalidator" rel="nofollow noreferrer"><strong>^{<cd8>}</strong> [DRF-doc]</a>:</p>
<pre><code>from rest_framework import serializers
from rest_framework.validators import <strong>UniqueValidator</strong>
class SignUpDetailsForm(serializers.ModelSerializer):
class Meta:
model = SignUpDetails
fields = (
'first_name',
'last_name',
'email',
'username',
'password',
)
extra_kwargs = {
'email': {
'validators': [<strong>UniqueValidator(queryset=SignUpDetails.objects.all())</strong>]
}
}</code></pre>
<p>现在序列化程序将检查电子邮件是否唯一,否则将引发错误。因此,您应该<em>而不是</em>在视图中进行验证,这属于序列化层</p>
<h2>选项2:指定电子邮件字段的唯一性</h2>
<p>如果定义了自己的用户模型,还可以使电子邮件字段唯一,则用户模型如下所示:</p>
<pre><code>from django.db import models
from django.contrib.auth.models import AbstractUser
class SignUpDetails(AbstractUser):
email = models.EmailField(
_('email address')
<strong>unique=True</strong>
)
# …</code></pre>