2017-04-26 3 views
-1

ich eine Funktion haben:Weiter nach Versuchen fehlgeschlagen

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() 

jedes Modell hat unique=True so try ich verwende, außer über den Fehler überspringen ich erhalte, wenn sich eine Daten einzugeben versucht, die in der bereits ist Datenbank. Wie kann ich diesen Code verdichten? Ich fühle mich wie eine Menge unnötiger Codezeilen.

+0

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

+0

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

Antwort

1

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!

Verwandte Themen