#google-cloud-datastore
#google-облачное хранилище данных
Вопрос:
Предположим:
class Contacts(db.Model):
first_name = StringProperty()
last_name = StringProperty()
phone_number = PhoneNumberProperty()
new_contact = Contacts(first_name="Homer", last_name="Simpson", phone_number = 1234566)
new_contact.put()
Я новичок в GAE Datastore, но согласно документам GAE Datastore (смотрите ниже, если интересно), я не могу изменить ни одного свойства объекта (например, phone_number). Я должен повторно объявить все свойства, а затем поместить () новый объект. Исключение ранее объявленных свойств из нового объекта приводит к тому, что они объявляются как None. Есть ли обходной путь для этого — например, переопределение вручную функции генерации имени ключа — чтобы объект сохранял тот же ключ?
#
из документов GAE Datastore: Чтобы обновить существующий объект, измените атрибуты объекта, затем вызовите метод put(). Данные объекта перезаписывают существующий объект. Весь объект отправляется в хранилище данных при каждом вызове put(). Примечание: API хранилища данных не проводит различия между созданием нового объекта и обновлением существующего объекта. Если ключ объекта представляет существующий объект, вызов его метода put() перезаписывает объект.
Комментарии:
1. найдено решение — необходимо вручную задать ключевое имя при создании объекта, затем повторно объявить то же ключевое имя после изменения свойств объекта — ПРЕДПОЛОЖИМ: new_contact = Contacts(имя_ключа=’homerjsimpson’, first_name=’homer’, last_name =’simpson’, phone_number = 123456).put() ЧТОБЫ ОБНОВИТЬ phone_number— new_contact=Контакты (имя_ключа=’homerjsimpson’, first_name=’homer’, last_name=’simpson’, phone_number =999999999). не создает новый объект
Ответ №1:
это неправда. У вас должен быть способ получить нужный контакт, и вы можете обновить именно его. Использование ключевого имени — это только один из способов сделать это. Если вы знаете идентификатор фильтрации запроса, чтобы получить только один объект, вы можете обновить поле из него и put(), чтобы обновить его.
У вас может быть что-то вроде:
query = Contact.all().filter('first_name', 'john').filter('last_name', 'doe')
for contact in query:
contact.phone_number = 498340594834
contact.put()
Обратите внимание, что этот код обновит все контакты с таким именем на этот номер телефона. Если существует более одного объекта с таким именем, обновляются оба. Использование ключевого имени может предотвратить это, но вам придется создавать более сложные ключи, поскольку могут совпадать только имя и фамилия.