【发布时间】:2020-09-28 21:17:53
【问题描述】:
我有一个记录交易的 Django 模型。我只需要更新一些交易的一些字段(两个)。
为了更新,要求用户提供额外数据,我使用 pandas 使用这些额外数据进行计算。
我使用 pandas 脚本的输出来更新原始模型,如下所示:
for i in df.tnsx_uuid:
t = Transactions.objects.get(tnsx_uuid=i)
t.start_bal = df.loc[df.tnsx_uuid==i].start_bal.values[0]
t.end_bal = df.loc[df.tnsx_uuid==i].end_bal.values[0]
t.save()
这很慢。最好的方法是什么?
更新: 经过一番研究,我找到了bulk_update并将代码更改为:
transactions = Transactions.objects.select_for_update()\
.filter(tnsx_uuid__in=list(df.tnsx_uuid)).only('start_bal', 'end_bal')
for t in transactions:
i = t.tnsx_uuid
t.start_bal = df.loc[df.tnsx_uuid==i].start_bal.values[0]
t.end_bal = df.loc[df.tnsx_uuid==i].end_bal.values[0]
Transactions.objects.bulk_update(transactions, ['start_bal', 'end_bal'])
这大约将所需时间减半。
如何进一步提高性能?
【问题讨论】:
标签: django-models django-views celery-task django-3.0