Django 为什么DRF跳过验证?
我有一个这样的验证器:(是的,它是空的,并且引发了expection) 和序列化程序:Django 为什么DRF跳过验证?,django,django-rest-framework,django-views,Django,Django Rest Framework,Django Views,我有一个这样的验证器:(是的,它是空的,并且引发了expection) 和序列化程序: class CampaignSerializer(CreatorModelSerializer): name = serializers.CharField(max_length=32, validators=[ AlphanumericValidator() ]) class Meta: model = Campaign fields
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
序列化程序正在成功验证名称
我的错在哪里
编辑:我忘记添加ActivityDetailSerializer.put方法的结尾。我添加了它们。我最疯狂的猜测是,您使用自定义验证器的方式应该与
ModelViewSet一起使用,以触发这些验证器
如果您正在执行自定义操作,请尝试覆盖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.',
),
]
此更改后,验证应能正常工作。您在ActivityDetailView中的put方法正是您得到的?如果没有,请编辑以进行完整的“放置”方法检查。@monio我添加了该方法的其余部分。
# 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.',
),
]