2012-08-05 2 views
8

"name"이라는 필드가있는 Hero라는 클래스가 있다고 가정 해 보겠습니다. 새로운 영웅 개체가 생성 될 때마다 " is a hero"을 추가하고 싶습니다. 그것에 __init__을 사용할 수 있습니까? 아니면 거기에 대해 재정의 할 수 장고 특정 메서드가 있습니까?장고 모델 작성에 __init__ 사용 하시겠습니까?

class Hero(modes.Model) 
    name = models.CharField(max_length=100) 
    def __init__(self, *args, **kwargs): 
     name += " is a hero" 
     super(Hero, self).__init__(*args, **kwargs) 
+1

이것은 거의 당신이 원하는 것이 아닙니다. 실제 문제를 설명하십시오. –

+0

@ IgnacioVazquez-Abrams 'Hero' 클래스의 집계 입력을 기반으로하는 다른 모델을 업데이트해야합니다. – Joey

+1

@Joey 대신 [signals] (https://docs.djangoproject.com/ko/1.4/topics/signals/)을 사용하십시오. – Dougal

답변

15

"새 영웅 객체가 생성 될 때마다"에 의해 당신이 의미하는 경우 "영웅 레코드가 데이터베이스에 생성 할 때마다,"다음 아니, 당신은 __init__ 방법으로이 작업을 수행하지 않으려는, 파이썬에서 히어로 오브젝트가 생성 될 때마다 호출됩니다. 데이터베이스에서 기존 레코드를 가져 오는 경우도 포함됩니다.

Django의 post_save signal을 사용하여 신호 콜백에서 created 키워드 매개 변수가 True이고 "작성 중"논리를 수행하는 경우이를 수행 할 수 있습니다. Djagno의 bulk_create 방법은 후 저장 신호 또는 save를 호출 중 하나를 트리거 건너 뛸 것

def save(self, *args, **kwargs): 
    if not self.pk: # object is being created, thus no primary key field yet 
     self.name += " is a hero" 
    super(Hero, self).save(*args, **kwargs) 

참고 :

또는

, 어떤 경우에 더 간단하고 자연, 다음과 같이 영웅의 save() 방법을 대체 할 수 있습니다.

+4

[docs explain] (https://docs.djangoproject.com/en/1.4/topics/db/models/#overriding-model-methods)에서 항상'* args'와'** kwargs'를 포함시켜야합니다. 부모 클래스의'save' 메쏘드를 호출하면 * super * (Hero, self) .save (* args, ** kwargs)가됩니다. 그 이유는 장고 나 코드에서'save()'메소드의 시그니처에 대한 미래의 변화를 막기 위해서입니다. – supervacuo

+1

@supervacuo - 잘 들어, 고맙습니다. – Ghopper21

+1

향후 독자를위한 경고로 'save'를 무시하는 것은 보편적으로 안전하지 않습니다. [배치 저장은 오버로드 된 저장 메소드를 호출하거나'post_save' 및'pre_save' 신호를 호출하지 않습니다 (https://docs.djangoproject.com/en/dev/topics/db/models/#overriding-model-methods). 장고가 일괄 업데이트 또는 생성을 사용자 정의 할 수있는 방법을 제공하는지 여부는 모르겠지만 그렇게 보이지는 않습니다. 따라서이 작업을 수행하는 방법에 신중을 기하며 방어하면 대용량 저장이 수행되지 않도록해야합니다. 사용자 정의 업데이트 동작. – Taywee