2013-02-20 2 views

ответ

0

Использовать временные метки. Если временная метка объекта, который вы пишете, не соответствует отметке времени, которую объект имел при ее прочтении, она была изменена тем временем.

1

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

Прежде всего, это хорошая идея, чтобы иметь этот класс базы для всех моделей с этими двумя свойствами, которые в настоящее время обновляется автоматически:

class Base(ndb.Model): 
    created = ndb.DateTimeProperty(auto_now_add=True) 
    modified = ndb.DateTimeProperty(auto_now=True) 

Теперь имея modified свойство в модели очень помогает, заметив если что-то изменилось (кем-то другим) во время обновления:

  • Перед редактированием читать modified имущество и хранить его в before_modified
  • Перед сохранением читать modified собственности и сравнить его с before_modified
  • Если эти два значения совпадают, то это безопасно сохранить, в противном случае уведомить пользователя о том, что этот объект был изменен кем-то другим
+0

Хорошее предложение. Спасибо @Lipis. Еще одна вещь, которую я хочу удостовериться в том, изменил ли пользователь какие-либо данные в сущности или просто нажал кнопку сохранения. т.е. «Транзакция» имеет около 33 свойств. Это длинная html-форма. и если пользователь отправляет запрос на отправку, он просто сохраняет объект без проверки того, изменил ли пользователь данные или нет. Есть ли способ проверить это, не проверив индивидуально? – 2013-02-20 11:28:19

+0

@Rookie Вы можете делать всевозможные умные вещи, чтобы упростить процесс .. но в конце .. вам нужно будет проверить, какие из этих 33 свойств были изменены (если вообще) до сохранения .. или давая знать пользователю которые были изменены. Это действительно зависит от того, как вы хотите достичь этого. Вы можете получить список всех свойств из 'Transaction._properties' для начала. – Lipis

+0

Альтернативной стратегией может быть создание записи блокировки (с текущим пользователем как должным образом) в качестве дочернего элемента записи. Если вы можете написать запись, которую знаете, у текущего пользователя есть блокировка. Включите созданное время, чтобы вы могли отменить устаревшие блокировки. Таким образом, никто не может изменить объект, пока пользователь его модифицирует. Помните, что просмотр временных меток потребует чтения. Один, чтобы получить объект изначально, 2-й прочитанный для извлечения непосредственно перед тем, как вы напишите, чтобы проверить текущую временную метку, затем напишите, и теоретически кто-то может втиснуться между вторым чтением и записью. –