django - 在 Django 中验证电子邮件的 ArrayField 的每个值
问题描述
我正在将 PostgreSQL 与 Django 一起使用,并且正在尝试使用ArrayField(models.EmailField(max_length=200))
. 但是我最终得到了一个500 error code(TypeError)
无效的电子邮件地址。
如何验证 ArrayField 中的每封电子邮件。我尝试在序列化程序和模型中编写验证方法。但没有任何帮助。验证 ArrayFields 的正确方法是什么?我正在使用 Django 2.1 和 Python 3.6
错误的回溯如下...请看一下
模型.py
billing_emails = ArrayField(models.EmailField(max_length=200))
公司 = models.OneToOneField(公司,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
提前致谢。
解决方案
如果您使用的是 Forms,请使用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
您也可以使用 模型的 clean 方法。
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)
推荐阅读
- python - 构造大小相等的集合,其中每个笛卡尔积的乘积都是唯一的
- django - Django模型:如何一次过滤多个值?
- sql - 如何在 HackerRank 上使用 SQL 查找折扣最大的产品
- reactjs - 你需要为 Plotly Dash Python 安装 React 吗?
- python - 尝试对成员进行 dm 时,discord bot 返回“列表索引超出范围”
- javascript - 获取光标之前或之后的元素
- css - 检查时显示第三列网格
- wso2 - 运行 Playground2 时出现错误无法为 JSP 编译类
- php - 如何使用 preg_replace 展开主题行?
- mongodb - React Native、Express、Node、MongoDB 堆栈