请考虑此简化方案。主从表:
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
的原理是什么,因为这是一个验证而非规范化规则。
我不断撞墙。在这种情况下,编写验证模式的正确方法是什么?