2012-08-12 11 views
9

Chcę podać domyślną wartość pola modelu z metody modelu.Domyślny model pola Django z metody modelu

Jak mogę to zrobić?

gdy próbuję to kod

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) 

otrzymuję NameError: nazwa 'ja' nie jest zdefiniowany.

Usunięcie "ja" powoduje, że parametr "create_id" wymaga 1 parametru.

+0

Czy identyfikator musi być unikatowy? person_id = models.AutoField (primary_key = True) Tak jak pomysł. – Don

+0

tak to musi być – yossi

Odpowiedz

4

skończyło się w ten sposób: (usunięcie siebie z obu)

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) 

to działa, ale nie jestem pewien, czy to jest najlepszy lub właściwy sposób.

+3

To * wygląda * dobrze. Zastanawiam się też, czy to jest dobra * praktyka. * – eugene

+0

Jak to działa? Myślę, że brakuje ci 'self' jako pierwszego parametru' create_id' i nazwij go tak: 'self.create_id()' zamiast 'create_id' – Paco

+0

@eugene to nie jest dobra praktyka w tym sensie, że id nie może być wyjątkowym, a ja przypuszczam, że tak powinno być. – dietbacon

9

Można zdefiniować metodę globalną tak:

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

Chciałbym dokonać metody klasy. – yossi

+0

Zwykle, jeśli potrzebujesz go do klasy, oznacza to, że prawdopodobnie potrzebujesz innych atrybutów modelu. metoda ".save()" byłaby najlepsza dla tego. –