我正在尝试更新我的工作中的100个对象,每两个小时安排一次。
我的模型中有文章表。解析所有文章,然后为每篇文章保存不同的属性。
首先我查询获取所有未解析的文章,然后解析针对文章保存的每个URL并保存接收的属性。 以下是我的代码
articles = Articles.objects.filter(status = 0) #100's of articles
for art in articles:
try:
url = art.link
result = ArticleParser(URL) #Custom function which will do all the parsing
art.author = result.articleauthor
art.description = result.articlecontent[:5000]
art.imageurl = result.articleImage
art.status = 1
art.save()
except Exception as e:
art.author = ""
art.description = ""
art.imageurl = ""
art.status = 2
art.save()
事情就是当这个作业运行时CPU利用率非常高,DB进程利用率也很高。我试图指出它何时何地达到峰值。
问题:这是更新多个对象的正确方法,还是有更好的方法吗?有什么建议。 感谢您的帮助。 此致
编辑1:对不起,请注意。有一些解释要做。像author,desc等字段对于解析URL后将返回的每篇文章都不同。我在循环中更新的原因是因为根据URL,这些字段对于每次迭代都是不同的。我已经更新了代码,希望它有助于消除混乱。
答案 0 :(得分:2)
您在相对紧凑的循环中执行了100次数据库操作,因此预计数据库会有一些负载。
根据我的理解,您不希望在所有文章中将字段author,description和imageurl设置为相同的值,因此QuerySet.update将不适合您。
答案 1 :(得分:1)
当您想要更新或删除多个对象时,Django建议采用这种方式:https://docs.djangoproject.com/en/1.6/topics/db/optimization/#use-queryset-update-and-delete
答案 2 :(得分:1)
1.不要使用'Exception',需要具体指定:KeyError,IndexError等。
2.Data可以创建一次。像这样:
data = dict(
author=articleauthor,
description=articlecontent[:5000],
imageurl=articleImage,
status=1
)
Articles.objects.filter(status=0).update(**data)
要修改1 :可能要设置定期任务 celery 。也就是说,对于每个查询到单独的任务。如需帮助,请参阅此documentation。