python - 模型视图集中的验证
问题描述
我必须验证图像。我已经尝试将验证器添加到字段中models.py
,但 python 不能migrate
根据类验证器。在这种情况下如何添加验证views.py
验证器.py
class ValidateImageSize:
MEASURE_UNIT_BYTE_MAP = {
'kb': 1024,
'mb': 1024 * 1024,
}
MEASURE_UNIT_NAME_MAP = {
'kb': 'kilobyte',
'mb': 'megabyte',
}
def __init__(self, max_size):
max_size, measure_unit = max_size.split(' ')
self.max_size = int(max_size)
self.measure_unit = measure_unit
def __call__(self, value):
if value.size > self.max_size * self.MEASURE_UNIT_BYTE_MAP[self.measure_unit]:
raise ValidationError(f'Size maximum is {self.max_size} {self.measure_unit}')
视图.py
class EpisodeView(viewsets.ModelViewSet):
def create(self, request, story_id=None, *args, **kwargs):
try:
story = Story.objects.get(pk=story_id)
except Story.DoesNotExist:
raise NotFound
kwargs = {
'story': story,
'title': request.data.get('title'),
'cover': request.data.get('cover'),
}
episode = Episode.objects.create(**kwargs)
for image in dict(request.data.lists())['images']:
EpisodeImage.objects.create(episode=episode, image=image)
return Response({'episode_id': episode.id}, status=201)
解决方案
首先,我们将验证所有图像的大小/格式是否正确,如果没有错误,那么我们将执行创建操作。
from .validators import ValidateImageSize
class EpisodeView(viewsets.ModelViewSet):
def create(self, request, story_id=None, *args, **kwargs):
try:
story = Story.objects.get(pk=story_id)
except Story.DoesNotExist:
raise NotFound
# now we will run image validation
custom_image_validator = ValidateImageSize() # with your desize size
for image in dict(request.data.lists())['images']:
custom_image_validator(image) # this will raise validation error if any validation error occur
# After that will do our regular work
kwargs = {
'story': story,
'title': request.data.get('title'),
'cover': request.data.get('cover'),
}
episode = Episode.objects.create(**kwargs)
for image in dict(request.data.lists())['images']:
EpisodeImage.objects.create(episode=episode, image=image)
return Response({'episode_id': episode.id}, status=201)
推荐阅读
- wordpress - 为什么谷歌分析上的自定义维度只显示总会话的 77%?
- vbulletin - 缩略图未显示在用户相册中
- python - TypeError:在分配变量时,只能将整数标量数组转换为标量索引
- java - 如何从 Java 中的给定 ZoneOffset 获取 ZoneId 值?
- c# - 起订量 不支持的表达式
- reactjs - 是否可以使用反应和表达但不能使用节点
- javascript - 未处理的承诺拒绝:错误:请求失败,状态码为 403 和未处理的承诺拒绝:错误:请求失败,状态码为 500
- cefsharp - CEFsharp 安全性
- pyrogram - Pyrogram 中未处理洪水
- android - Flutter中facebook应用程序的包名和类名