Как сделать проверку в сериализаторах django? - PullRequest
0 голосов
/ 08 октября 2019

У меня есть 2 пользовательские функции проверки, созданные с использованием пакетов из PyPI, я хочу включить их в мой serializers.py в моем проекте django, прежде чем преобразовать его в JSON с помощью rest. Проблема в том, что я не знаю, где и как поместить функции так, чтобы код проходил через них. Вот мой код: введите описание изображения здесь (именно так я сейчас добавляю пользователей, используя поля модели, которые я зарегистрировал) Вот мой код:

/* 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 () из введенных данных и выполнить validate_email, чтобы узнать, существует ли электронная почта. Пожалуйста, скажите мне, какие изменения должны быть сделаны, я не знаю, если проблема в views.py, который все еще использует models.py или я должен зарегистрировать сериализатор как модель?

1 Ответ

0 голосов
/ 08 октября 2019

Для запуска проверок необходимо вызвать serializer.is_valid(), однако для этого требуется, чтобы данные передавались в сериализатор, а не в экземпляры. Логика заключается в том, что drf проверяет поступающие данные, а не данные, уже сохраненные в вашей БД

Правильная логика

Соображения

  1. Похоже, вы реализуете представление списка, но вы проверяете адрес электронной почты, что, вероятно, не то, что вы намеревались сделать в первую очередь. Я думаю, вы хотите проверить электронную почту при создании.

  2. Вы можете использовать общие представления и миксины drf, такие как GenericViewSet, ListModelMixin и ListModelMixin

  3. Я думаю, у вас есть тип в validate_emailplus, где вы пытаетесь get поле email, в то время как сериализатор объявляет его как emailplus

  4. Вы, похоже, не следуете PEP-8 (руководство по стилю для Python)

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("emailplus")
        if not validate_email(email, check_mx=True, verify=True):
            raise serializers.ValidationError("Invalid email")
        return email

views.py

from rest_framework import mixins, viewsets

class BasicViewSet(
    viewsets.GenericViewSet,
    mixins.ListModelMixin,
    mixins.CreateModelMixin,
):
    queryset = Basic.objects.all()
    serializer_class = BasicSerializer

Для лучшего понимания того, как работают viewset и mixins, я рекомендую проверить их реализацию

Проверка на сайте администратора

Со скриншотаВы добавили, похоже, что вы пытаетесь проверить на сайте администратора, для этого рассмотрим следующий код:

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 генерирует формы на основеваши модели, а затем формы вызывают full_clean() на модели, которая вызывает clean()

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...