【发布时间】:2019-10-01 17:54:50
【问题描述】:
我不确定在相关模型中对外键整数字段求和的最佳实践方法是什么。举一个基于django教程构建库的例子:
假设您已经创建了书籍和书籍实例库,每本书都包含图书馆中的许多真实书籍实例。您在 BookInstance 上维护检出次数的整数字段。通过这种方式,您可以查看每个特定实例已签出的次数。现在,您想要汇总书籍模型中实例被检出的所有时间,以便您可以快速参考图书馆中检出次数最多的书籍。在 Book 模型中汇总所有这些值的最佳做法是什么?
我目前有一个适用于我的案例的工作解决方案,它存储一个整数字段,用于在书籍模型本身上检出的次数,然后我在书籍模型中有一个从 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() 表达式来处理这个问题。
有没有更好的方法来获得与我目前相同的结果?
【问题讨论】:
标签: python django django-models foreign-keys