Edw*_*ark 5 python django django-orm
有没有更有效的方法可以用 F 表达式来做到这一点?一些如何减少命中数据库?
# 1st way hits DB twice per object
def something():
pks = [4, 2, 1, 3, 0]
for i in range(len(pks)):
mymodel.objects.get(pk=pks[i]).update(attr=i)
# 2nd way hits DB once per obj and once for the queryset
def something():
pks = [4, 2, 1, 3, 0]
order = Case(*[When(pk=pk, then=pos) for pos, pk in enumerate(pks)])
query = mymodel.objects.filter(pk__in=pks).order_by(order)
for i in range(len(query)):
query[i].attr = i
query[i].save()
Run Code Online (Sandbox Code Playgroud)
编辑移动变量一致。
通常应避免进行多个数据库查询而不是一次大型查询。然而你的情况似乎是一个例外。(注意:我是根据提供的信息做出这个答案的。请不要编辑你的问题来说明我的真正意思......)
无论您有多少记录,以下查询都会非常快,因为它从主键检索单个项目。所有 RDBMS 都旨在很好地处理这个问题。
mymodel.objects.get(pk=a[i])
Run Code Online (Sandbox Code Playgroud)
但是你可以像这样使你的函数更加高效:
def something():
pks = [4, 2, 1, 3, 0]
for i in range(len(a)):
mymodel.objects.filter(pk=a[i]).update(attr=i)
Run Code Online (Sandbox Code Playgroud)
现在每个对象只访问数据库一次。上面的查询只是翻译为
UPDATE mapp_mymodel SET attr=i where pk=1
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
1997 次 |
| 最近记录: |