2013-03-31 13 views
22

Ich versuche, eine benutzerdefinierte Validierung für ein Modell durchzuführen, und ich bin verwirrt. Lass mich konkret sein. Lassen Sie uns sagen, dass mein Code wie folgt:Wird save() implizit aufgerufen, wenn create in django aufgerufen wird?

class FooManager(models.Manager): 
    def create_foo(self, name): 
    return self.create(foo_name = name) 

class Foo(models.Model): 
    foo_name = models.CharField(max_length=30) 
    objects = FooManager() 

    def clean(self): 
    ... 
    def save(self, *args, **kwargs): 
    self.full_clean() 
    super(User, self).save(*args, **kwargs) 

Nun, wenn ich mit diesem Modell aus der Shell arbeite, wenn ich rufe:

f = Foo.objects.create_foo ("")

Es wird ein Validierungsfehler erhöhen, bevor ich eine Chance t erhalten o rufe save() auf f auf. Warum passiert das? Sollte der Validierungsfehler nicht erst ausgelöst werden, wenn ich f.save() aufruft?

Hinweis: Das gleiche passiert, wenn ich objects.create() im Gegensatz zu den benutzerdefinierten create-Methode verwenden. Jede Hilfe würde sehr geschätzt werden, denn ich finde Validierungen im Django ziemlich frustrierend.

Antwort

0

Sie haben vergessen self in Ihrem Manager wird automatisch

class FooManager(models.Manager): 
    def create_foo(self, name): 
     return self.create(foo_name = name) 
+0

Nein, tut mir leid, das war die Schuld meines schlechten Beispiels. In meinem eigentlichen Code stelle ich mich selbst in den Manager. Soll ich meinen tatsächlichen Code aufstellen, wird das helfen? – innospark

16

create() zu setzen sparen also auch wenn Sie Ihre Fehler zu beheben - Sie werden immer noch sicher, dass die Argumente machen müssen, um die Datenbankanforderungen erstellen erfüllen eine sparen Aufzeichnung.

+0

Warum erstellt automatisch speichern? In den Dokumenten steht Folgendes: "Beachten Sie, dass das Instanziieren eines Modells in keiner Weise Ihre Datenbank berührt; dafür müssen Sie speichern()." Also, was ist der Aufruf von save(), wenn create() automatisch speichert? – innospark

+2

Das ist der springende Punkt, Sie müssen 'save()' nicht aufrufen, weil 'create()' eine Verknüpfung ist, um eine Instanz zu erstellen und dann automatisch zu speichern. –

+0

ohhh, perfekt. Ich habe gerade den Punkt in der Dokumentation gefunden, wo er das beschreibt, ich schätze, ich werde versuchen, härter zu lesen! Vielen Dank, du hast mich eine ganze Weile gerettet, Burhan! – innospark