Как упорядочить по полю, хранящемуся в отдельной модели?

#google-app-engine #google-cloud-datastore

#google-app-engine #google-облако-хранилище данных

Вопрос:

Вот упрощенная версия моей структуры хранилища данных:

 class News(db.Model):
    title = db.StringProperty()

class NewsRating(db.Model):
    user = db.IntegerProperty()
    rating = db.IntegerProperty()
    news = db.ReferenceProperty(News)
  

Теперь мне нужно отобразить все новости, отсортированные по их общему рейтингу (сумма оценок разных пользователей). Как я могу это сделать в следующем коде:

 news = News.all()
# filter by additional parms
# news.filter("city =", "1")
news.order("-added") # ?
for one_news in news:
    self.response.out.write(one_news.title() '<br>')
  

Ответ №1:

Запросы имеют доступ только к объекту, к которому вы запрашиваете запрос. если у вас есть свойство из другого объекта (или какое-то совокупное вычисление на основе полей из других объектов), которое вы хотите использовать для упорядочивания результатов, вам нужно будет сохранить его в объекте, к которому вы запрашиваете.

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

Комментарии:

1. Итак, я должен добавить новый рейтинг свойств для каждого новостного объекта, верно? Если я хочу обновлять его каждый раз, когда добавляется новая запись в рейтинг новостей, как я могу убедиться, что каждый голос подсчитывается (т. Е. При чтении и записи другой транзакции не происходит транзакции записи)?

2. Дэйв, похоже, в моем сценарии нет особого смысла для счетчиков сегментирования пользователей (я не ожидаю, что у меня будет более 5 голосов в секунду за каждую новость). Итак, я могу следовать подходу, описанному в моем комментарии выше. Я прав?

Ответ №2:

Для этого вам нужно будет выполнить запрос, извлекающий каждую отдельную NewsRating ссылку на ваш News объект, и суммировать все оценки (поскольку хранилище данных не предоставляет объединения). Это будет огромной задачей как по времени, так и по затратам. Я бы рекомендовал взглянуть на только что услышанный пример в качестве ориентира.