2015-11-06 4 views
1

Я хочу проверить модель NDB. Моя модель что-то вроде:Ndb Проверка модели с взаимозависимыми свойствами?

class Sample(ndb.Model): 
    x = ndb.IntegerField() 
    y = ndb.IntegerField() 

Я хочу, чтобы гарантировать, что х < у в любой момент времени.

подходов я попытался: функция Validator

  1. Записи и вызов из перегруженной конструкторы. Но значения полей могут быть изменены позже. И он должен проверять каждый раз, когда он экономит

  2. Добавить _pre_put_hook - но это кажется излишним. Плюс - это не выбросит ошибку, пока объект не будет на самом деле сохраняется в хранилище данных

В идеале я хочу, что всякий раз, когда или б изменяется - функция должна быть вызвана, которая будет проверять, если объект действителен еще ошибка выброса.

Примечание: В настоящее время я использую _pre_put_hook.

+2

_pre_put_hook не является излишним. Я считаю его более подходящим, чем валидатор. Если вы измените критерии проверки и существующий объект больше не освобождается, вы не сможете получить его, так как проверка не завершится. –

+0

Кроме того, гарантируя, что x

+0

Спасибо Тим. Это очень помогло. –

ответ

0

Это должно быть сделано за пределами логики ndb.Model.

Просто создайте функцию внутри модели, как следующее:

class Sample(ndb.Model): 
    x = ndb.IntegerField() 
    y = ndb.IntegerField() 

    @classmethod 
    def new(cls, x, y): 
    if x >= y: 
     raise Exception 
    return cls(x=x, y=y) 

Затем замените родовое Exception, который я использовал с обычаем один и поймать его попытку блока.

+0

Это решение не предотвращает изменение 'x' или' y' недопустимого значения после создания. –

+0

Мужчины - это та же логика. Определите новую функцию под названием update ..., которая использует ту же самую проверку. Возможно, в вспомогательном методе DRY. – janscas

Смежные вопросы