0

考虑这个简化的场景。主从表:

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,因为这是一个验证,而不是规范化规则。

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

4

0 回答 0