2011-02-16 2 views
1

어떻게 작성된 기본값을 charfield에 추가 할 수 있습니까?장고 charfield 기본값을 작성

클래스 MyClass에 (XXX) :

type = models.ForeignKey(somewhere) 
code = models.CharField(default=("current id of MyClass wich is autoincremented + type value")) 

은 가능합니까?

답변

2

이렇게하려면 모델에서 save 메서드를 재정의합니다.

class MyClass(models.Model): 
    ... 

    def save(self): 
     super(Myclass,self).save() 
     if not self.code: 
      self.code = str(self.id) + str(self.type_id) 
      self.save() 

는 코드 빈 필드를 만드는 것처럼, 조심해야 할 물건이있다, 그러나 당신은 아이디어를 얻을.

2

당신은 락스 제안으로이 기본이며, 비어 있지 = 거짓, 코드가 좀 달라야 이후는, 그러나, 방법을 저장 오버라이드 (override) :

Class MyClass(models.Model): 
... 
def save(self): 
    if not self.id: 
     self.code = str(self.id) + str(self.type_id) 
    return super(Myclass,self).save()) 
+0

"self.id가 아닌 경우"에서 어떻게 self.id 값을 사용할 수 있습니까? 어쩌면 당신은 "self.code가 아니라면"을 의미했을 것입니다. –

+0

Django 1.5에서는 이것이 깨진 것 같습니다. 나는 새로운 개체가 저장 될 때까지 self.id 필드가 채워지지 않는다는 인상을 받고있다. 따라서 Lakshman의 답변에서 이중 저장. –

0

당신은 또한 post_save 신호를 사용할 수

from django.db.models import signals 

class MyClass(models.Model): 
    type = models.ForeignKey(somewhere) 
    code = models.CharField(blank=True) 

def set_code_post(instance, created, **kwargs): 
    instance.code = str(instance.id) + str(instance.type_id) 
    instance.save() 

signals.post_save.connect(set_code_post, sender=MyClass) 

또는 그 문제에 관해서, 당신은 두 번) (저장 실행 방지하기 위해 pre_save 및 post_save 신호의 조합을 사용할 수 있습니다 ...

from django.db.models import signals 

class MyClass(models.Model): 
    type = models.ForeignKey(somewhere) 
    code = models.CharField(blank=True) 

def set_code_pre(instance, **kwargs): 
    if hasattr(instance, 'id'): 
     instance.code = str(instance.id) + str(instance.type_id) 

def set_code_post(instance, created, **kwargs): 
    if created: 
     instance.code = str(instance.id) + str(instance.type_id) 
     instance.save() 

signals.pre_save.connect(set_code_pre, sender=MyClass) 
signals.post_save.connect(set_code_post, sender=MyClass) 
관련 문제