Я не уверен, каков наилучший способ суммирования значений из целочисленных полей внешнего ключа в связанной модели.Чтобы привести пример на основе учебника по django для создания библиотеки:
Допустим, вы создали свою библиотеку книг и экземпляров книг, в каждой из которых содержится много реальных экземпляров, находящихся в библиотеке.Вы поддерживаете целочисленное поле в BookInstance количество проверенных раз.Таким образом, вы можете увидеть, сколько раз был извлечен каждый конкретный экземпляр.Теперь вы хотите суммировать все случаи, когда экземпляры были извлечены в модели книги, чтобы вы могли получить краткий справочник о том, какая книга была извлечена больше всего в вашей библиотеке.Какова была бы лучшая практика для суммирования всех этих значений в модели Книги?
В настоящее время у меня есть рабочее решение для моего случая, которое хранит целочисленное поле для числа проверок на самой модели книги, а затем яу меня есть функция в модели книги, которую я вызываю из модели BookInstance:
def update_times_checked_out(self):
instances = BookInstance.objects.filter(book__id = self.id)
times_checked_out = 0
for i in instances:
times_checked_out += i.number_of_times_checked_out
self.number_of_times_checked_out = times_checked_out
self.save()
В настоящее время это работает нормально, но я могу себе представить, что с добавлением в базу данных все большего и большего количества BookInstances это может начать становиться очень медленным.Я также знаю, что это, вероятно, будет иметь состояние гонки, если оно вызывается дважды в разных экземплярах BookInstances.
Я знаю о выражениях F () и использую их в простых приращениях + = 1, но в моемв случае реального мира это обновление будет обрабатывать не только постоянные приращения значения, но и большие скачки значения (может быть +1/10/500 в любое время только из 1 экземпляра).Поэтому я не знаю, как правильно использовать выражения F (), чтобы справиться с этим.
Есть ли лучший способ получить тот же результат, который у меня есть в настоящее время?