Запросы не нет - PullRequest
       12

Запросы не нет

2 голосов
/ 25 августа 2010

У меня есть модель со ссылочным свойством, например:

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)

Каким образомбудет лучше?

Спасибо.

1 Ответ

3 голосов
/ 25 августа 2010

Я бы посоветовал вам использовать дополнительное поле модели. Это более гибко, поскольку позволяет также запрашивать сведения, которые не имеют ссылок на данные. Кроме того, запросы могут иметь только один фильтр неравенства, поэтому лучше сохранить этот фильтр неравенства для другого свойства, где неравенство имеет больший смысл, например целочисленные свойства.

Чтобы флаг всегда обновлялся, вы можете добавить вспомогательную функцию в Details, например:

class Details(db.Model):
    data = db.ReferenceProperty(reference_class=Data)
    has_data = db.BooleanProperty(default=False)

    def add_data(self, data):
        """ Adds data"""
        if not data: return
        self.has_data = True
        self.data = data
        return self.put()
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...