Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/276.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/67.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 如何在django序列化程序中进行验证?_Python_Django_Django Rest Framework - Fatal编程技术网

Python 如何在django序列化程序中进行验证?

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

我有两个使用PyPI包创建的自定义验证函数,我想在django项目中的serializers.py中包含它们,然后使用rest将其转换为JSON。问题是我不知道把函数放在什么地方或如何放进去,这样代码就可以运行了。这是我的密码: (这就是我现在使用模型的字段添加用户的方式) 这是我的密码:

/* 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验证传入的数据,而不是数据库中已经存储的数据

正确的逻辑

考虑

  • 看起来您正在实现一个列表视图,但是您正在验证电子邮件地址,这可能不是您最初打算做的。我猜你想在创建时验证电子邮件

  • 您可以使用drf的通用视图和混合,例如
    GenericViewSet
    ListModelMixin
    ,以及
    ListModelMixin

  • 我认为您在
    validate\u emailplus
    中有一个类型,您尝试
    get
    字段
    email
    ,而序列化程序将其声明为
    emailplus

  • 您似乎没有遵循PEP-8(Python样式指南)

  • 序列化程序.py

    重新导入
    导入电话号码
    从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.py

    class 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你为什么要这么做?验证必须在存储到数据库之前进行,以保持数据库的完整性,而不是在从数据库读取数据时进行验证。实际上,这就是我的意思,在将数据存储到数据库之前验证数据。