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

Я создал новое свойство для своей модели 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)

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

logos.filter("is_approved = ", None)

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

Ответов (3)

Решение

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

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

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

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

Согласно документу http://code.google.com/appengine/docs/python/datastore/gqlreference.html :

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

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

Практика, которая помогает нам, - назначать поле «версия» для каждого вида. Эта версия изначально устанавливается для каждой записи на 1. Если возникает такая необходимость (заполнить новое или существующее поле в большом наборе данных), поле версии позволяет перебирать все записи, содержащие «version = 1». Путем итерации, устанавливая для нового поля либо «ноль», либо другое начальное значение, повышаем версию до 2, сохраняем запись, позволяем заполнить новое или существующее поле значением по умолчанию.

Преимущество поля «версия» заключается в том, что процесс выбора может продолжать выбор по этому более низкому номеру версии (изначально установленному на 1) в течение такого количества сеансов или столько времени, сколько потребуется, пока ВСЕ записи не будут обновлены с новым значением поля по умолчанию.