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)
но это не сработало.
В окне просмотра данных новые значения полей отображаются как.
Ответы
Ответ 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-запрос в вашем конкретном случае?