2013-03-31 12 views
22

Sto provando a eseguire alcune convalide personalizzate su un modello e mi sto confondendo. Lasciami essere specifico. Diciamo che il mio codice è il seguente:È save() chiamato implicitamente quando si chiama create in django?

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) 

Ora, quando sto lavorando con questo modello dal guscio, se chiamo:

f = Foo.objects.create_foo ("")

Si alzerà un errore di convalida prima di avere la possibilità t o chiama save() su f. Perché succede? Non dovrebbe essere sollevato l'errore di convalida solo quando chiamo f.save()?

Nota: la stessa cosa accade se utilizzo object.create() in opposizione al metodo di creazione definito dall'utente. Qualsiasi aiuto sarebbe molto apprezzato, poiché trovo che le convalide nel django siano piuttosto frustranti.

risposta

0

avete dimenticato di mettere self nel gestore

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

No, mi dispiace che sia stata colpa del mio povero esempio. Nel mio codice vero mi metto auto nel manager. Dovrei mettere il mio codice effettivo, sarà d'aiuto? – innospark

16

create() salverà automaticamente, quindi, anche se a correggere il vostro errore - si avrà ancora per assicurarsi che gli argomenti per la creazione di soddisfare i requisiti di database per salvare un disco.

+0

Perché il salvataggio automatico viene salvato? Nei documenti si dice quanto segue: "Si noti che l'istanziazione di un modello non tocca in alcun modo il proprio database, per questo è necessario salvare()." Quindi qual è il punto di chiamata save(), se create() salverà automaticamente? – innospark

+2

Questo è il punto, non è necessario chiamare 'save()' perché 'create()' è una scorciatoia per creare un'istanza, e quindi salvarla automaticamente. –

+0

ohhh, perfetto. Ho appena trovato il punto nei documenti in cui è delineato questo, credo che proverò a leggere più difficile! Grazie mille, mi hai salvato un po 'di tempo Burhan! – innospark

Problemi correlati