def validate_number_of_product(products):
if len(products) > 1:
# this may be temporary
raise ValidationError(_('Too many products.'))
class OrderAddSerializer(serializers.ModelSerializer):
products = serializers.PrimaryKeyRelatedField(
queryset=Product.objects.filter(sold=False),
write_only=True,
validators=[validate_number_of_product],
many=True, allow_empty=False,
)
# ...
我正在使用PrimaryKeyRelatedField
和many=True
,并且还需要(独立(验证该字段。但似乎在调用OrderAddSerializer.is_valid()
时没有调用validate_number_of_product
.这是 DRF 的限制还是因为我使用不当?
many=True
的行为与您假设的行为不同。 它在后台创建一个ListSerializer
来处理列表部分,并将每个实例委托给"初始"序列化程序。
您需要确保将验证器提供给ListSerializer
而不是OrderAddSerializer
。
该文档介绍了如何自定义ListSerializer
初始化。正如您在源代码中看到的,验证器通过LIST_SERIALIZER_KWARGS
从 init 中过滤掉。