当`many`为True时,`validators`关键字参数不起作用?

时间:2017-08-27 02:33:20

标签: django django-rest-framework

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,还需要验证字段(独立)。但是在调用validate_number_of_product时似乎没有调用OrderAddSerializer.is_valid()。这是DRF的限制还是因为我使用不正确?

1 个答案:

答案 0 :(得分:1)

many=True与您的假设有不同的行为。 它在场景后面创建一个ListSerializer来处理列表部分,并将每个实例委托给" initial"串行器。

您需要确保向ListSerializer而不是OrderAddSerializer提供验证器。

documentation说明了如何自定义ListSerializer初始化。正如您在the source中看到的那样,验证程序通过LIST_SERIALIZER_KWARGS从init中过滤掉。