1

У меня есть ОПРС класс модели, как показано ниже:Как обновить одно свойство для нескольких объектов NDB?

class Contest(ndb.Model): 
    end_date = ndb.DateProperty(required=True, indexed=True) 
    ended = ndb.BooleanProperty(required=False, indexed=True) 
    ... 

у меня будет ежедневно хроны, чтобы отметить конкурсы с прошедшим end_date с ended равным True. Я написал следующий код, чтобы сделать это:

contests = Contest.query() 
current_datetime = datetime.datetime.utcnow() 
today = datetime.date(current_datetime.year, current_datetime.month, current_datetime.day) 
contests = contests.filter(Contest.end_date < today) 
contests = contests.filter(Contest.ended == False) 
contests = contests.fetch(limit=10) 
for contest in contests: 
    contest.ended = True 
ndb.put_multi(contests) 

Но мне не нравится это, потому что я должен прочитать все объекты просто обновить одно значение. Есть ли способ изменить его, чтобы читать keys_only?

ответ

1

Данные объекта перезаписывают существующий объект. Весь объект отправляется DATASTORE

https://cloud.google.com/datastore/docs/concepts/entities#Datastore_Updating_an_entity

Таким образом, вы не можете отправить только одно поле из объекта, он будет «удалить» все существующие поля. Чтобы быть более точным - замените объект на все поля новой версией объекта, имеющей только одно поле.

Вы должны загрузить все объекты, которые хотите обновить, со всеми свойствами, а не только с ключами, установить новое значение свойства и вернуть обратно в базу данных.

+0

Спасибо, Игорь. Означает ли это, что мой подход является лучшим (с точки зрения количества операций чтения/записи)? –

+0

Да, это выглядит как оптимальный –

1

Я думаю, что это свойство Python является хорошим решением здесь:

class Contest(ndb.Model): 
    end_date = ndb.DateProperty(required=True, indexed=True) 

    @property 
    def ended(self): 
     return self.end_date < date.today() 

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

+0

Спасибо, Kekito. Никогда не видел таких свойств раньше. Смогу ли я использовать его значение в NDB-фильтре? –

+0

Нет, потому что он не хранится в хранилище данных. Однако вы можете просто выполнить запрос на 'end_date' для достижения той же цели. –

+0

GAE не позволяет иметь более одного фильтра неравенства, поэтому я не могу использовать 'end_date' напрямую, поэтому я реализую дополнительное свойство' закончено'. –