1

У меня есть довольно простая модель ndb, которая уже существует, имеет экземпляры, созданные в хранилище данных. Это выглядит примерно так:В том числе нет значений в упорядоченном запросе NDB

class ExampleModel(ndb.Model): 
    property1 = ndb.StringProperty() 
    property2 = ndb.StringProperty() 

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

class ExampleModel(ndb.Model): 
    property1 = ndb.StringProperty() 
    property2 = ndb.StringProperty() 
    created = ndb.DateTimeProperty(auto_now_add=True) 

Когда я делаю это, и попытаться запросить список лиц, заказанный created, он возвращает только объекты, которые были созданы после обновления определения модели.

things = ExampleModel.query().order(ExampleModel.created).fetch() 

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

ответ

2

Основано на this answer, похоже, что вы не можете этого сделать.

Рекомендуем установить свойство string в пустую строку. В вашем случае вы можете использовать определенное значение даты по умолчанию. Ваш код должен быть достаточно умным, чтобы исключить это значение. Возможно, что-то вроде этого:

class ExampleModel(ndb.Model): 
    DEFAULT_CREATED = datetime(2000, 1, 1) 
    property1 = ndb.StringProperty() 
    property2 = ndb.StringProperty() 
    created = ndb.DateTimeProperty(auto_now_add=True) 

    def created2(self): 
     if self.created == DEFAULT_CREATED: 
      return None 
     else: 
      return self.created 

    def created2(self, value): 
     if value is None: 
      self.created = DEFAULT_CREATED 
     else: 
      self.value = value 

Вы, конечно, должны обновить все нулевые значения в хранилище данных к значению по умолчанию, но ваш код клиента гораздо проще value = instance.created2() и instance.created2(value).

2

Вы не сможете сортировать старые объекты в новом поле .created - они не будут отображаться в индексе, который используется для сортировки.

Все, что вам нужно, это обновление существующих объектов в соответствии с новым определением модели. В простейшей форме вы можете просто получить(), а затем сразу же поместить() ваши объекты с добавлением свойства .created в модель.

В документации к App Engine есть полезная статья - Updating Your Model Schema.

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

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