Подтвердить что ты не робот

AppEngine: хранилище данных запроса для записей с <отсутствующим> значением

Я создал новое свойство для своей модели db в хранилище данных Google App Engine.

Старый:

class Logo(db.Model):
  name = db.StringProperty()
  image = db.BlobProperty()

Новое:

class Logo(db.Model):
  name = db.StringProperty()
  image = db.BlobProperty()
  is_approved = db.BooleanProperty(default=False)

Как запросить записи Logo, для которых не установлено значение 'is_approved'? Я попробовал

logos.filter("is_approved = ", None)

но это не сработало. В окне просмотра данных новые значения полей отображаются как.

4b9b3361

Ответ 1

В соответствии с документацией App Engine по Queries and Indexes существует различие между объектами, которые не имеют значения для свойства, и те, которые имеют для него нулевое значение; и "Объекты без фильтрованного свойства никогда не возвращаются по запросу". Таким образом, невозможно написать запрос для этих старых записей.

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

Ответ 2

Возможно, это изменилось, но я могу фильтровать записи на основе полей null.

Когда я пытаюсь выполнить запрос GQL SELECT * FROM Contact WHERE demo=NULL, он возвращает только записи, для которых отсутствует демонстрационное поле.

В соответствии с документом http://code.google.com/appengine/docs/python/datastore/gqlreference.html:

Правая часть сравнения может быть одной из следующих (как подходящий для типа данных свойства): [...] логический литерал, как ИСТИНА или ЛОЖНЫЙ; NULL, который представляет нулевое значение (None in Python).

Я не уверен, что "null" совпадает с "отсутствует" , хотя: в моем случае эти поля уже существовали в моей модели, но не были заполнены на создание. Может быть, Federico вы могли бы сообщить нам, работает ли NULL-запрос в вашем конкретном случае?