验证列表元素在 Marshmallow 中是唯一的

jcu*_*nte 3 python marshmallow

我想了解是否可以使用棉花糖验证函数来检查列表中的所有元素是否唯一。

我有以下架构:

from marshmallow import Schema, fields, validate

class PaymentSchema(Schema):
    ...
    currencies = fields.List(
        fields.String(
            required=True,
            validate=[
                validate.OneOf(["USD", "EUR", "AUS", "GBP"]),
                validate.Length(min=1, max=4)
            ]
        )
    )
Run Code Online (Sandbox Code Playgroud)

是否有可能保证给定具有重复货币的货币列表 ( ["USD", "EUR", "EUR"]) 引发ValidationError

谢谢!

Mic*_*uth 5

装饰validates允许自定义验证:

from marshmallow import Schema, ValidationError, fields, validate, validates

class PaymentSchema(Schema):
    currencies = fields.List(
        fields.String(
            required=True,
            validate=[
                validate.OneOf(["USD", "EUR", "AUS", "GBP"]),
                validate.Length(min=1, max=4)
            ]
        )
    )

    @validates('currencies')
    def no_duplicate_currencies(self, value):
        if len(value) != len(set(value)):
            raise ValidationError('currencies must not contain duplicate elements')
Run Code Online (Sandbox Code Playgroud)