2

Ich habe eine Funktion gemacht, die an ein Pre-Save-Signal eines Modells angeschlossen wird. Innerhalb der Funktion versuche ich bereits in der Tabelle vorhanden mit, wenn das Modell Instanz pk zu überprüfen:Django Model.object.get pre_save Funktion Weirdness

sender.objects.get(pk=instance._get_pk_val()) 

Die erste Instanz des Modells einen Fehler auslöst. Ich erhalte den Fehler und erzeuge ein Slug-Feld aus dem Titel. In einer zweiten Instanz wird der Fehler nicht ausgelöst. Ich habe den Wert von instance._get_pk_val() auf beiden Fällen, und sie sind die gleichen: Keine

So:

# This one raises an error in the sluggit function 
instance1 = Model(title="title 1") 
instance1.save() 

# This one doesn't raise an error 
instance2 = Model(title="title 2") 
instance2.save() 

Das ist mein dritter Tag Herumspielen mit Python und Django. Es tut mir also leid, wenn es etwas neues gibt, das ich nicht sehe.

Edit:

Das Modell:

class Test(models.Model): 
    title = models.CharField(max_length=128) 
    slug = models.SlugField(max_length=128) 
    slug.prepopulate_from=('title',) 

signals.pre_save.connect(package.sluggit, sender=Test) 

Die Funktion Basics:

def sluggit(sender, instance, signal, *args, **kwargs): 
    try: 
     sender.objects.get(pk=instance._get_pk_val()) 
    except: 
     # Generate Slug Code 

@ S.Lot erzählte mir die save() Methode in den Kommentaren zu überschreiben. Ich muss es versuchen. Ich möchte immer noch wissen, warum der zweite Aufruf von model.objects.get() keinen Fehler mit dieser Methode verursacht.

Bearbeiten 2 Vielen Dank @ S.Lot. Das Überschreiben der Speichermethode funktioniert einwandfrei. Immer noch neugierig auf die Signalmethode. Hmm, komisch.

bearbeiten 3 Nach etwa ein wenig mehr zu spielen, fand ich, dass instance.objects.get mit() anstelle von sender.objects.get() funktioniert:

def sluggit(sender, instance, signal, *args, **kwargs): 
    try: 
     sender.objects.get(pk=instance._get_pk_val()) 
    except: 
     # Generate Slug Code 

Bedürfnisse sein:

def sluggit(sender, instance, signal, *args, **kwargs): 
    try: 
     instance.objects.get(pk=instance._get_pk_val()) 
    except: 
     # Generate Slug Code 

Ein Fehler? Aus irgendeinem Grund dachte ich, sender.objects.get() wäre dasselbe wie Test.objects.get().

+0

Was versuchst du wirklich zu erreichen? Warum fummelst du an dem Verhalten von Django beim Update und bei den Einfügungen? Es gibt selten einen Grund, sich mit pre_save zu messen. Was versuchst du wirklich? –

+1

Ich versuche ein SlugField aus dem Titel zu generieren.Wenn es ein Update ist, möchte ich nicht, dass es einen neuen Slug erzeugt. – Matt

+0

@Matt: Bitte aktualisieren Sie Ihre Frage mit neuen Fakten. Sie müssen sich dafür nicht mit pre_save anlegen. Überschreiben Sie Speichern(). –

Antwort

1

S.Lott ist korrekt ... Verwenden Sie save(), wie Sie bereits bestätigt haben, dass Sie damit begonnen haben.

Wie für die Signalfrage kann ich ehrlich gesagt nichts falsch mit Ihrem Code sehen. Ich habe es sogar selbst erfolgreich vor Ort laufen lassen. Bist du sicher, dass du es in der Frage richtig darstellst? Oder dass instance2 nicht bereits ein vorhandenes Datenbankobjekt ist (vielleicht ein Fehler in Ihrem Testcode)?

+0

Ich habe versucht, dies in der manage.py Shell zu testen. Genau das habe ich versucht: >>> von testing.models import Test >>> t1 = Test (title = "ein Testtitel") >>> t1.save() >>> t1.slug 'a-Test-Titel' >>> t2 = Test (title = "Test-Titel") >>> t2.save() >>> t2.slug '' – Matt

+0

Wow, das ist hässlich. Hmm, ich werde über meinen Code schauen und sehen, ob ich einen Fehler gemacht habe. – Matt

+0

Ich habe gerade bemerkt "prepopulate_from" ... welche Version von Django benutzt du? Fehlt das ... wie lautet der Code in "Slug Code generieren"? –

0

Danke für das Posten. Die Top-Ergebnisse von Google (zu der Zeit, ich poste dies) sind ein wenig veraltet und zeigen die alte Art der Verbindung von Signalen (die vor kurzem neu geschrieben wurde, anscheinend). Ihre Bearbeitungen mit den korrigierten Code-Schnipsel zeigten mir, wie es gemacht wird.

Ich wünschte, mehr Poster bearbeitet ihre Kommentare, um eine Lösung darin zu platzieren. Vielen Dank. :-)