尝试失败后继续

时间:2017-04-26 20:30:42

标签: python django loops try-except

我有一个功能:

def save_to_models(all_item_tags):
    from article.models import Articles    
    for item in all_item_tags:
        newobj = Articles()
        try:
            newobj.pub_date    =item.contents[9].contents[0]
        except:
            continue
        try:
            newobj.title       =item.contents[1].contents[0]
        except:
            continue    
        try:   
            newobj.description =item.contents[5].contents[0]
        except:
            continue
        try:
            newobj.image       =get_the_picture(item.contents[7])
        except:
            continue

        newobj.save()

每个模型都有unique=True所以我使用try,除了跳过我在尝试输入已经存在于数据库中的数据时得到的错误。我该如何压缩这段代码?我觉得它有很多不必要的代码行。

1 个答案:

答案 0 :(得分:1)

Django很聪明:就像其中一条评论中所述,只有在调用 save()方法时才会引发错误。在此之前,Article是一个普通的Python对象。你应该看起来更像这样:

from psycopg2 import IntegrityError # this is the actual error raised by psycopg2 (the postgres python driver)

from article.models import Articles

for item in all_item_tags:
    try:
        new_article = Articles(
            pub_date=item.contents[9].contents[0],        
            title=item.contents[1].contents[0],
            description=item.contents[5].contents[0],
            image=get_the_picture(item.contents[7])

        new_article.save() # this is where the actual save happens
    except IntegrityError:
        # Handle the exception here

另一个(更高级)选项是覆盖save()方法并将逻辑放在那里。

也就是说,您也可以使用get_or_created来做到这一点。它看起来像这样:

for item in all_item_tags:
    # this methods returns a boolean True of False if the object is already in the DB.
    # use your unique identifier here
    article, created = Article.objects.get_or_create(unique_id=...)

    # You can then do a classic if-else without handling any errors...
    if created: 
        # Great! The object a
    else:
        # the object exist, do something with it or not...

但是,我会建议一些事情。我的感觉是你在没有真正了解Python的情况下潜入Django。 Django是一个很棒的野兽,它使很多东西变得非常方便(几乎神奇),但它仍然是Python。如果你潜水太深而且有什么东西坏了,你就很难知道发生了什么。我建议你进一步了解Python(它是一种令人惊叹的语言,这会很有趣),然后回到Django,或者开始使用像Flask这样不那么神奇的小框架!目前,这里是关于错误处理的官方文档的链接,因此您可以了解更多相关信息。另外,Django非常好doc所以如果出现问题,我会先看看那里。

欢呼和快乐的编码!