python - Django:更新多个对象属性

标签 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()

编辑移动变量一致。

最佳答案

通常要避免进行多个数据库查询而不是一个大型查询。但是你的情况似乎是一个异常(exception)。 (注意:我是根据所提供的信息做出这个回答的。请不要编辑你的问题,说我实际上是说......)

无论您有多少条记录,以下查询都会非常快,因为它是从主键中检索单个项目。所有 RDBMS 都旨在很好地处理这个问题。

mymodel.objects.get(pk=a[i]) 

如何使您的功能更高效:

def something():
  pks = [4, 2, 1, 3, 0]
  for i in range(len(a)):
    mymodel.objects.filter(pk=a[i]).update(attr=i)

现在每个对象只访问数据库一次。上面的查询只是翻译成

 UPDATE mapp_mymodel SET attr=i where pk=1

关于python - Django:更新多个对象属性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41253059/

相关文章:

python - 将新的键值对添加到python中现有的键值对对象

python - 我应该如何存储从 Django 调用的长时间运行的进程的状态?

python - 从 values() 或 values_list() 中排除字段

python - 功能记录器在 Pytest 中引发 FileNotFoundError

python - 如何将标志传递给 distutils 扩展?

python - 在 Django 中计算大型数据集

python - 在 Python 中自动化 Selenium 测试

django - 将 Django ORM 迭代放入一个请求

django - 在 Django ORM 的子查询中返回多个值

python - 从 for 循环和列表写入 .csv 文件