我有一个功能:
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,除了跳过我在尝试输入已经存在于数据库中的数据时得到的错误。我该如何压缩这段代码?我觉得它有很多不必要的代码行。
答案 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所以如果出现问题,我会先看看那里。
欢呼和快乐的编码!