Python 如何在django序列化程序中进行验证?
我有两个使用PyPI包创建的自定义验证函数,我想在django项目中的serializers.py中包含它们,然后使用rest将其转换为JSON。问题是我不知道把函数放在什么地方或如何放进去,这样代码就可以运行了。这是我的密码: (这就是我现在使用模型的字段添加用户的方式) 这是我的密码:Python 如何在django序列化程序中进行验证?,python,django,django-rest-framework,Python,Django,Django Rest Framework,我有两个使用PyPI包创建的自定义验证函数,我想在django项目中的serializers.py中包含它们,然后使用rest将其转换为JSON。问题是我不知道把函数放在什么地方或如何放进去,这样代码就可以运行了。这是我的密码: (这就是我现在使用模型的字段添加用户的方式) 这是我的密码: /* serializers.py */ import re import phonenumbers from rest_framework import serializers from phonenum
/* serializers.py */
import re
import phonenumbers
from rest_framework import serializers
from phonenumbers import carrier
from validate_email import validate_email
class basicSerializer(serializers.Serializer):
emailplus = serializers.EmailField()
country = serializers.CharField(max_length=2)
phone_number = serializers.CharField(max_length=100)
def validate_emailplus(self):
email = self.validated_data.get("email")
if not validate_email(email, check_mx=True, verify=True):
raise serializers.ValidationError("Invalid email")
return email
/* views.py */
from django.shortcuts import render
from django.http import HttpResponse
from django.shortcuts import get_object_or_404
from rest_framework.views import APIView
from rest_framework.response import Response
from rest_framework import status
from .models import basic
from .serializers import basicSerializer
class basicList(APIView):
def get(self, request):
basic1 = basic.objects.all()
serializer = basicSerializer(basic1, many=True)
return Response(serializer.data)
def post(self):
pass
正如您所见,我不再使用models.py和serializers.py作为给定电子邮件和电话字段的某种模型。为了使我的函数能够工作(目前还没有),它需要从输入的数据中使用get()方法,并验证电子邮件以了解电子邮件是否存在。请告诉我应该进行哪些更改,我不知道问题是否出在仍然使用models.py的views.py上,或者我是否应该将序列化程序注册为模型?要运行验证,必须调用
序列化程序。is_valid()
,但是,这要求将数据传递到序列化程序而不是实例。这背后的逻辑是drf验证传入的数据,而不是数据库中已经存储的数据
正确的逻辑
考虑
GenericViewSet
,ListModelMixin
,以及ListModelMixin
validate\u emailplus
中有一个类型,您尝试get
字段email
,而序列化程序将其声明为emailplus
重新导入
导入电话号码
从rest_框架导入序列化程序
从电话号码导入运营商
从验证电子邮件导入验证电子邮件
类BasicSerializer(serializers.Serializer):
emailplus=serializers.EmailField()
国家/地区=序列化程序.CharField(最大长度=2)
电话号码=serializers.CharField(最大长度=100)
def validate_emailplus(自我):
email=self.validated\u data.get(“emailplus”)
如果未验证电子邮件(电子邮件,检查\u mx=True,验证=True):
引发序列化程序。ValidationError(“无效电子邮件”)
返回电子邮件
views.py
from rest_framework import mixins, viewsets
class BasicViewSet(
viewsets.GenericViewSet,
mixins.ListModelMixin,
mixins.CreateModelMixin,
):
queryset = Basic.objects.all()
serializer_class = BasicSerializer
为了更好地了解viewset和Mixin的工作方式,我建议检查
管理站点中的验证
从你添加的截图中,看起来你试图在管理站点中验证,因为考虑下面的代码:
models.pyclass Basic(models.Model):
...
def clean(self):
if not validate_email(self.email, check_mx=True, verify=True):
raise ValidationError("Invalid email")
这是因为Django admin根据您的模型生成表单,然后表单调用模型上的
full\u clean()
,该模型调用clean()
我相应地更改了代码,但出现了一个错误,说明cannot call是有效的,因为实例化序列化程序实例时没有传递data=关键字参数。@Jackson\u这是因为您试图验证现有实例,而不是数据,签出我的更新答案实际上我想首先使用函数validate_emailplus验证电子邮件,然后将数据转换为json格式,并使用apiview@Jackson_Stake你为什么要这么做?验证必须在存储到数据库之前进行,以保持数据库的完整性,而不是在从数据库读取数据时进行验证。实际上,这就是我的意思,在将数据存储到数据库之前验证数据。