Django模型:最佳更新方法?

时间:2013-12-04 12:33:27

标签: 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 = 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,这些字段对于每次迭代都是不同的。我已经更新了代码,希望它有助于消除混乱。

3 个答案:

答案 0 :(得分:2)

您在相对紧凑的循环中执行了100次数据库操作,因此预计数据库会有一些负载。

  1. 如果你有很多文章,请确保在状态列上有一个索引以避免表扫描。
  2. 您可以尝试禁用autocommit并将整个更新包装在一个事务中。
  3. 根据我的理解,您不希望在所有文章中将字段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