Могу ли я заставить свойство модели Appengine вызывать функцию? - PullRequest
0 голосов
/ 24 февраля 2010

Я реализую главную страницу с «горячими» историями на основе определенного алгоритма ранжирования. Однако я не могу понять, как передать хранилище данных Appengine мою собственную функцию сортировки (как я могу это сделать в python с помощью sort (key = Ranking_function)). Я хочу что-то вроде этого:

class Story(db.Model):
    user = db.ReferenceProperty(User)
    text = db.TextProperty()
    def ranking(self):
        # my ranking function, returns an int or something
        return 1
    ranking = property(ranking_function)

Так что я могу позже позвонить:

Story.all().order("ranking").limit(50)

Есть идеи, как это сделать, используя модели хранилищ данных Appengine?

Ответы [ 2 ]

3 голосов
/ 24 февраля 2010

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

Вместо этого вы должны просто иметь целочисленное свойство под названием rank и устанавливать его каждый раз, когда вы обновляете сущность. Затем вы можете использовать это свойство в своем заказе.

1 голос
/ 25 февраля 2010

Нет встроенного свойства, которое обрабатывает это, но есть библиотека, aetycoon , которая реализует DerivedProperty и другие связанные свойства, которые делают то, что вы хотите. Вот статья о том, как это работает.

...