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().
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? –
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
@Matt: Bitte aktualisieren Sie Ihre Frage mit neuen Fakten. Sie müssen sich dafür nicht mit pre_save anlegen. Überschreiben Sie Speichern(). –