Database Django模型:更新的最佳方法?
我正在尝试每两小时更新作业中的100个对象 我的模型中有一个表。解析所有项目,然后为每个项目保存不同的属性 首先,我查询以获取所有未解析的文章,然后解析根据文章保存的每个URL,并保存收到的属性。 下面是我的代码Database Django模型:更新的最佳方法?,database,django,python-2.7,django-models,Database,Django,Python 2.7,Django Models,我正在尝试每两小时更新作业中的100个对象 我的模型中有一个表。解析所有项目,然后为每个项目保存不同的属性 首先,我查询以获取所有未解析的文章,然后解析根据文章保存的每个URL,并保存收到的属性。 下面是我的代码 articles = Articles.objects.filter(status = 0) #100's of articles for art in articles: try: url = art.link result = Article
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,这些字段在每次迭代中都是不同的。我已经更新了代码,希望它有助于消除混淆。Django建议您在更新或删除多个对象时使用这种方式:Django建议您在更新或删除多个对象时使用这种方式:1.最好不要使用“异常”,需要具体指定:KeyError、Indexer等 2.数据可以创建一次。大概是这样的:
data = dict(
author=articleauthor,
description=articlecontent[:5000],
imageurl=articleImage,
status=1
)
Articles.objects.filter(status=0).update(**data)
要编辑1:可能需要设置定期任务芹菜。也就是说,为每个查询分配一个单独的任务。要获得帮助,请参见此部分。1.最好不要使用“异常”,需要具体指定:KeyError、Indexer等 2.数据可以创建一次。大概是这样的:
data = dict(
author=articleauthor,
description=articlecontent[:5000],
imageurl=articleImage,
status=1
)
Articles.objects.filter(status=0).update(**data)
要编辑1:可能需要设置定期任务芹菜。也就是说,为每个查询分配一个单独的任务。有关帮助,请参见此图。您正在一个相对较紧的循环中执行100秒的DB操作,因此预计DB上会有一些负载
据我所知,您不希望在所有文章中将字段author、description和imageurl设置为相同的值,因此QuerySet.update对您不起作用。您在一个相对较紧的循环中执行了100次DB操作,因此预期DB上会有一些负载
据我所知,您不希望在所有文章中将字段author、description和imageurl设置为相同的值,因此QuerySet.update不适用于您。每个文章的字段author、description和imageurl都不同。上面的代码只是一个概述。解析url后将返回这些字段。@planet260是的,我就是这样理解的。那么,您就不能像其他建议的答案那样使用QuerySet.update。对于每篇文章,author、description和imageurl字段都是不同的。上面的代码只是一个概述。解析url后将返回这些字段。@planet260是的,我就是这样理解的。那么就不能像其他答案建议的那样使用QuerySet.update。