Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/django/20.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Database Django模型:更新的最佳方法?_Database_Django_Python 2.7_Django Models - Fatal编程技术网

Database Django模型:更新的最佳方法?

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

我正在尝试每两小时更新作业中的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,这些字段在每次迭代中都是不同的。我已经更新了代码,希望它有助于消除混淆。

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。