验证cerberus中的子表

时间:2018-10-26 22:48:08

标签: python validation cerberus

请考虑此简化方案。主从表:

CREATE TABLE queue (
    id bigint PRIMARY KEY,
    num text NOT NULL UNIQUE
);

CREATE TABLE queue_device (
    id bigint PRIMARY KEY,
    queue_id bigint NOT NULL REFERENCES queue ON DELETE CASCADE,
    device text NOT NULL,
    UNIQUE (queue_id,device)
);

添加设备时,用户显然不知道id,而是输入num。因此,我尝试了以下验证模式:

SCHEMA = {
    'queue': {
        'type': 'string',
        'empty': False,
        'required': True,
        'rename': 'queue_id',
        'coerce': 'queue_id'
    },
    'device': {
        'type': 'string',
        'empty': False,
        'required': True
    }
}

我想重命名该字段并将其强制为适当的值,但是自定义强制不执行。我敢肯定,在强制之前进行重命名是有道理的,但是我看不到。这样,您实际上就无法在同一字段上同时拥有renamecoerce规则。

好的,所以我试图在重命名的字段上设置强制,将其标记为readonly,因为用户不能直接设置它。

SCHEMA = {
    'queue': {
        'type': 'string',
        'empty': False,
        'required': True,
        'rename': 'queue_id'
    },
    'device': {
        'type': 'string',
        'empty': False,
        'required': True
    },
    'queue_id': {
        'readonly': True,
        'coerce': 'queue_id'
    }
}

我先进行验证,然后进行归一化。

if not validator.validate(document, normalize=False):
    raise ValidationError('Document validation failed.', validator.errors)
document = validator.normalized(document)

由于readonly规则,此操作失败。再次,我想知道在规范化过程中检查readonly的原理是什么,因为这是一个验证而非规范化规则。

我不断撞墙。在这种情况下,编写验证模式的正确方法是什么?

0 个答案:

没有答案