Django ist smart: wie in einem der Kommentare angegeben, wird es nur einen Fehler auslösen, wenn die save() Methode aufgerufen wird. Bis dahin ist Article
ein normales Python-Objekt. Was sollten Sie eher wie dieses aussehen würde:
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
Weitere (erweiterte) Option ist die save()
Methode außer Kraft zu setzen und Ihre Logik dort setzen.
Das heißt, Sie könnten auch get_or_created
verwenden, um das zu tun. Es sieht so aus:
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...
Allerdings gibt es ein paar Dinge, die ich vorschlagen würde. Mein Gefühl ist, dass Sie in Django eintauchen, ohne Python wirklich zu kennen. Django ist ein großes Biest, das eine Menge Dinge wirklich praktisch macht (fast magisch), aber es ist immer noch Python. Wenn du zu tief tauchst und etwas kaputt geht, wird es sehr schwer für dich sein zu wissen, was vor sich geht. Ich schlage vor, Ihr Wissen über Python zu erweitern (es ist eine erstaunliche Sprache, damit es Spaß macht) und dann zurück nach Django zu gehen oder vielleicht mit einem kleineren Framework wie Flask anzufangen, das weniger magisch wirkt! Für den Moment, hier ist ein Link zum offiziellen Dokument zur Fehlerbehandlung, damit Sie ein bisschen mehr darüber lernen können. Außerdem hat Django wirklich gute doc so würde ich zuerst dort nachsehen, wenn ein Problem auftaucht.
Prost und fröhliche Codierung!
Für eine Sache, [* benutzen Sie nicht bloß 'ausgenommen' *] (http://blog.codekills.net/2011/09/29/the-evils-of--except--/) - sei speziell darüber, was schiefgehen könnte. Wenn Sie zum anderen Fehler für eine Zeile unterdrücken möchten und Python 3.4+ verwenden, lesen Sie ['contextlib.suppress'] (https://docs.python.org/3/library/contextlib.html#contextlib. unterdrücken). Auch das Ausrichten von Leerzeichen ist keine gute Idee. – jonrsharpe
Der * eindeutige Fehler * wird ausgelöst, wenn Sie versuchen, ein doppeltes Objekt ** zu speichern. Also, keine Notwendigkeit für all diese "try ... except" -Klauseln. Verschieben Sie 'newobj.save()' einfach in eine 'try ... except'-Klausel. – xyres