У меня есть модель со ссылочным свойством, например:
class Data(db.Model):
x = db.IntegerProperty()
class Details(db.Model):
data = db.ReferenceProperty(reference_class = Data)
Ссылка на данные может быть None.
Я хочу получить все объекты Details, которые имеют действительные данные, то есть длясвойство ссылки не является None.
Следующие работы:
Details.all().filter('data !=', None).fetch(1000)
Однако, согласно документации для запросов , запрос !=
будет фактически выполнятьсядва запроса, что в данном случае кажется ненужным.Оптимизирована ли !=
для выполнения только одного запроса при использовании с None?
В качестве альтернативы, в этом посте упоминает, что NULL всегда сортируется перед допустимыми значениями.Поэтому, по-видимому, также работает следующее:
Details.all().filter('data >', None).fetch(1000)
Хотя это будет делать только один запрос, использование >
вместо !=
делает намерение того, что он делает, менее очевидным.
В качестве третьего варианта я мог бы добавить в модель дополнительное поле:
class Details(db.Model):
data = db.ReferenceProperty(reference_class = Data)
has_data = db.BooleanProperty()
Пока я синхронизировал has_data с данными, я мог бы сделать:
Details.all().filter('has_data =', True).fetch(1000)
Каким образомбудет лучше?
Спасибо.