Py学习  »  Django

验证django中电子邮件数组字段的每个值

SEJ • 5 年前 • 1638 次点击  

我在django中使用postgresql,并试图使用 ArrayField(models.EmailField(max_length=200)) . 但我最终得到了一个 500 error code(TypeError) 提供无效电子邮件地址时。

如何验证ArrayField中的每个电子邮件。我尝试在序列化程序和模型中编写验证方法。但没什么帮助。验证ArrayFields的正确方法是什么?我使用的是django 2.1和python 3.6

错误的回溯如下…请查看

模特儿

billing_emails=arrayfield(models.emailfield(max_length=200))

company=models.onetoonefield(company,on_delete=models.cascade)

追溯

Traceback (most recent call last):
  File "/home/user/.local/share/virtualenvs/backend-Amy45Zrz/lib/python3.6/site-packages/django/core/handlers/exception.py", line 34, in inner
    response = get_response(request)
  File "/home/user/.local/share/virtualenvs/backend-Amy45Zrz/lib/python3.6/site-packages/django/core/handlers/base.py", line 156, in _get_response
    response = self.process_exception_by_middleware(e, request)
  File "/home/user/.local/share/virtualenvs/backend-Amy45Zrz/lib/python3.6/site-packages/django/core/handlers/base.py", line 154, in _get_response
    response = response.render()
  File "/home/user/.local/share/virtualenvs/backend-Amy45Zrz/lib/python3.6/site-packages/django/template/response.py", line 106, in render
    self.content = self.rendered_content
  File "/home/user/.local/share/virtualenvs/backend-Amy45Zrz/lib/python3.6/site-packages/rest_framework/response.py", line 72, in rendered_content
    ret = renderer.render(self.data, accepted_media_type, context)
  File "/home/user/.local/share/virtualenvs/backend-Amy45Zrz/lib/python3.6/site-packages/djangorestframework_camel_case/render.py", line 8, in render
    return super(CamelCaseJSONRenderer, self).render(camelize(data), *args,
  File "/home/user/.local/share/virtualenvs/backend-Amy45Zrz/lib/python3.6/site-packages/djangorestframework_camel_case/util.py", line 17, in camelize
    new_dict[new_key] = camelize(value)
  File "/home/user/.local/share/virtualenvs/backend-Amy45Zrz/lib/python3.6/site-packages/djangorestframework_camel_case/util.py", line 16, in camelize
    new_key = re.sub(r"[a-z]_[a-z]", underscoreToCamel, key)
  File "/home/user/.local/share/virtualenvs/backend-Amy45Zrz/lib/python3.6/re.py", line 191, in sub
    return _compile(pattern, flags).sub(repl, string, count)
TypeError: expected string or bytes-like object

提前谢谢。

Python社区是高质量的Python/Django开发社区
本文地址:http://www.python88.com/topic/43190
 
1638 次点击  
文章 [ 1 ]  |  最新文章 5 年前
ruddra
Reply   •   1 楼
ruddra    6 年前

如果使用表单,请使用 Form Serializer ,您可以使用 clean_<attribute_name> 方法验证数据。例如:

from django.core.validators import email_re
from django.core.exceptions import ValidationError

class YourForm(forms.ModelForm):  # serializers.ModelSerializer

    def clean_billing_emails(self): 
         data = self.cleaned_data['billing_emails']
         for email in data:
             if not email_re.match(email):
                 raise ValidationError('Invalid email {}'.format(email)  # or raise serializers.ValidationError
         return data

你也可以用 model's clean method .

class YourModel(models.Model):
    ...
    def clean(self):
         try:
              for email in self.billing_emails:
                  if not email_re.match(email):
                       raise ValidationError('Invalid email {}'.format(email) 
         except (TypeError, Exception)  as e:
              # log error
              # handle error

    def save(self, *args, **kwargs):
        self.full_clean()
        return super(YourModel, self).save(*args, **kwargs)