django - 为什么 DRF 跳过验证?
问题描述
我有一个这样的验证器:(是的,它是空的并引发异常)
class AlphanumericValidator(object):
def __init__(self):
pass
def __call__(self, value):
raise serializers.ValidationError(
'Value should contain only letters, numbers, - and _ characters.'
)
和序列化器:
class CampaignSerializer(CreatorModelSerializer):
name = serializers.CharField(max_length=32, validators=[
AlphanumericValidator()
])
class Meta:
model = Campaign
fields = ('id', 'name')
validators = [
UniqueTogetherValidator(
queryset=Campaign.objects.all(),
fields=['account', 'name'],
message='A campaign with this name is already exists.',
),
]
我的有效载荷:
id: 5
name: "aaq???asdas"
我的观点:
class CampaignDetailView(APIView):
permission_classes = (IsOwner, )
def get_object(self, request, campaign_pk):
campaign = get_object_or_404(Campaign, pk=campaign_pk)
self.check_object_permissions(request, campaign)
return campaign
def put(self, request, campaign_pk):
campaign = self.get_object(request, campaign_pk)
serializer = CampaignSerializer(
campaign,
data=request.data,
context={
'request': request,
}
)
if serializer.is_valid(raise_exception=True):
serializer.save()
return Response(
serializer.data,
)
权限所有者:
class IsOwner(permissions.BasePermission):
def has_object_permission(self, request, view, obj):
return request.user.profile.account == obj.account
序列化程序正在成功验证名称。
我的错误在哪里?
编辑:我忘了添加 CampaignDetailSerializer.put 方法的结尾。我添加了它们。
解决方案
我最疯狂的猜测是,您使用自定义验证器的方式应该与 一起使用ModelViewSet
,以触发这些验证器。
如果您正在做一些自定义的事情,请尝试覆盖上的validate
方法ModelSerializer
像下面这样
# I guess that CreatorModelSerializer is a sub-class of ModelSerializer.
class CampaignSerializer(CreatorModelSerializer):
def validate(self, attrs):
# Do Validations
if True:
raise serializers.ValidationError(
'ABBBBALIIIZA'
)
# Otherwise return the attributes
return attrs
class Meta:
model = Campaign
fields = ('id', 'name')
validators = [
UniqueTogetherValidator(
queryset=Campaign.objects.all(),
fields=['account', 'name'],
message='A campaign with this name is already exists.',
),
]
在此更改之后,验证应该可以正常工作。
推荐阅读
- c# - 我需要什么版本的 system.dll 才能在 c# 上启用 get{} 和 set{} 属性?
- api - 创建一个 API 来连接 ArangoDB 和 Prometheus 以获取 ArangoDB 内部数据的指标并将其暴露在 Prometheus 中
- python-3.x - 如何无限循环队列线程
- react-native - 我该如何解决这个问题?下面的控制按钮隐藏在日历界面(webview)中
- python-3.x - 特金特。在窗口中创建可调整大小的框架
- swift - Change Current Date To One Before / One After - Swift DatePicker
- ruby-on-rails - RVM:意外删除了除了 gem 之外的可执行文件,现在 gemset 已损坏
- excel - 谷歌电子表格公式
- vba - vba 中用于从 dir 编辑文件的无效过程调用或参数错误
- reactjs - 'event' 已弃用,我可以用什么代替?