2012-08-12 8 views
9

Desidero fornire un valore predefinito del campo modello dal metodo di un modello.Campo modello Django predefinito dal metodo modello

Come posso farlo?

quando provo questo codice

Class Person(models.Model): 
    def create_id(self): 
     return os.urandom(12).encode('hex') 

    name = models.CharField(max_length = 255) 
    id = models.CharField(max_length = 255,default = self.create_id) 

ottengo NameError: nome di 'sé' non è definito.

Se rimuovo il 'sé', ottengo che 'create_id' ha bisogno di 1 parametro.

+0

L'ID deve essere univoco? person_id = models.AutoField (primary_key = True) Proprio come un'idea. – Don

+0

sì, deve essere – yossi

risposta

4

ho finito per fare questo: (togliendo l'io sia)

Class Person(models.Model): 
    def create_id(): 
     return os.urandom(12).encode('hex') 

    name = models.CharField(max_length = 255) 
    id = models.CharField(max_length = 255,default = create_id) 

si sta lavorando, ma non sono sicuro se questo è il migliore o il modo giusto.

+3

Questo * sembra * buono. Mi chiedo anche se questa è una buona pratica *. * – eugene

+0

Come funziona? Penso che manchi 'self' come il primo parametro di' create_id', e lo chiamo in questo modo: 'self.create_id()' invece di 'create_id' – Paco

+0

@eugene non è una buona pratica nel senso che l'id potrebbe non essere unico, e immagino che dovrebbe essere. – dietbacon

9

È possibile definire il metodo globale come questo:

def create_id(): 
    return os.urandom(12).encode('hex') 

Class Person(models.Model): 
    name = models.CharField(max_length = 255) 
    id = models.CharField(max_length = 255,default = create_id) 
+1

mi piacerebbe fare il metodo della classe. – yossi

+0

Di solito se ne hai bisogno per essere nella classe, significa che probabilmente hai bisogno di altri attributi del modello. il metodo '.save()' sarebbe il migliore per questo. –