Утверждение дочерней таблицы в Цербере

Рассмотрим этот упрощенный сценарий. Мастер-таблицы:

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
    }
}

Я хотел переименовать поле и привести его к правильному значению, но пользовательский coercer не выполняется. Я уверен, что есть основания для переименования до принуждения, но я, например, этого не вижу. Таким образом, вы не можете иметь оба rename а также coerce правила на том же поле.

ОК, поэтому я попытался установить coercer на переименованном поле, отмечая его 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 ответов

Другие вопросы по тегам