【发布时间】:2018-03-15 18:08:57
【问题描述】:
假设我有以下四条记录(假设还有更多):
record 1 record 2 record 3 record 4
area California Texas California California
food Lobster Lamb Rabbit Bagels
popular Bagels Elk Rabbit Rabbit
现在我通过手动选择area 和food 将新记录添加到数据库中。然后通过在输入时为特定area 查找最常见的food 自动填充popular 字段。
例如,如果以上四个记录是整个数据库中的唯一记录,那么如果我要添加另一条记录 area: California 和 food: Bagels 然后 popular(对于我刚刚添加的记录)会自动分配值Bagels,因为food 字段中将有两个Bagels,用于区域California。
以上已经可以使用了,我通过以下代码实现了以上功能:
popular = list(ModelData.objects.filter(area=area).values_list('food', flat=True))
Counter(popular).most_common()
问题是,以上操作仍然使数据库中的现有记录具有不正确的popular 值;因为popular 仅在输入时计算,而在添加更多条目时永远不会“重新计算”。
使用上面的示例(使用area: California 和food: Bagels 添加新记录),仍然会有两个California 记录(record 3 和record 4)具有不正确的popular 值 -当Bagels 成为California 最受欢迎的新食物时,它们应该更新为Bagels。
如何更新每个area 的popular 值,使其成为新的、最受欢迎的food,只要它发生变化(或定期,即每小时/每天)?
我尝试过在线搜索,毫无疑问,没有任何运气,因为我意识到这是一个相当令人困惑的问题。
【问题讨论】:
-
cron之类的东西可以定期运行更新。当关键信息发生变化时,celery之类的东西可以排队请求重新计算热门页面。请记住,SQLite 一次只能运行一个更新事务,因此如果您的重新计算需要很长时间,届时您的数据库将变为有效的只读状态。 -
@9000 我使用
schedule库尝试过类似的操作,但是它使用while True循环,所以我不明白当代码需要重复调用时如何使用它,但它不能,因为它陷入了无限循环。
标签: python sql django python-3.x sqlite