考虑这个简化的场景。主从表:
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
}
}
我想重命名该字段并将其强制为正确的值,但自定义强制器不会被执行。我确信在强制之前进行重命名是有理由的,但我没有看到它。这样,您实际上不能在同一字段上同时拥有rename
和coerce
规则。
好的,所以我尝试在重命名的字段上设置强制器,标记它,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
,因为这是一个验证,而不是规范化规则。
我一直在撞墙。在这种情况下,编写验证模式的正确方法是什么?