基本上我们可以在不这样做的情况下获得相同的结果:
from my_app import models
for prd,count in x.iteritems():
models.AggregatedResult.objects.filter(product=prd).update(linked_epp_count=count)
? 很明显,x是包含与AggregatedResult的产品字段相同的键的字典,'value'是我想要更新的计数。在具有<的测试台上运行需要超过2-3分钟。目前,15k行和表的大小约为20万,预计将增长到一百万。所以,我需要帮助。
答案 0 :(得分:0)
最简单(但不是最安全)的方法是使用raw sql query。
类似的东西:
for prd,count in x.iteritems():
from django.db import connection, transaction
cursor = connection.cursor()
query = """
UPDATE {table}
set {column} = {value}
where {condition} = {condition_value}""".format(
table=AggregatedResult._meta.db_table,
condition='product',
condition_value=prd,
column='linked_epp_count',
value=count
)
cursor.execute(query)
transaction.commit_unless_managed()
警告:未经过测试,极易受到sql注入攻击。使用风险自负
替代(更安全)方法是首先将x
的内容加载到临时表中,而不是只发出一个要更新的原始查询。假设x的临时表是temp_prod
:
update aggregated_result ar
set linked_epp_count=tp.count
from temp_prod tp
where ar.product = tp.product
如何将数据从x
上传到临时表是我不太精通的,所以它留给你。 :)