#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
объект, и суммировать все оценки (поскольку хранилище данных не предоставляет объединения). Это будет огромной задачей как по времени, так и по затратам. Я бы рекомендовал взглянуть на только что услышанный пример в качестве ориентира.