2009-10-28 1 views
10

레코드를 저장 한 후 즉시 업데이트하려고합니다. 이 예는 무의미한 것 같다하지만 데이터가 몇 가지 추가 정보를 얻을하고 기록 갱신에 저장 한 후 우리는 API를 사용할 필요가 상상할 수 : 그래서django의 post_save를 사용하여 즉시 인스턴스를 업데이트하십시오.

def my_handler(sender, instance=False, **kwargs): 
    t = Test.objects.filter(id=instance.id) 
    t.blah = 'hello' 
    t.save() 

class Test(models.Model): 
    title = models.CharField('title', max_length=200) 
    blah = models.CharField('blah', max_length=200) 

post_save.connect(my_handler, sender=Test) 

'추가'필드가 '안녕하세요'로 설정하도록되어를 각 저장 후. 옳은? 하지만 작동하지 않습니다.

아이디어가 있으십니까?

+0

어쩌면 어떻게 작동하지 않는지 설명 할 수 있습니까? 처음에는 홍당무로, 무한 루프를 만드는 것처럼 보입니다. 왜냐하면 post_save 호출은 save를 호출하기 때문에 post_save 등을 호출해야하기 때문입니다. 장고가 재귀를 막고있을 가능성이 있습니까? –

+0

거기에 무한 루프가 있습니다. t.save()가 post_save 신호를 보낸 후 어떤 함수가 호출되는지 추측합니다 ... – stefanw

+0

오, 나는 장고가 두 번째 저장 트리거를 저장하지 못하게했을 것입니다. post_save? 나는 그렇지 않다. 어떤 경우에 당신 말이 맞습니다. 그것은 무한 루프 일 것입니다. 하지만 루프가 보이지 않습니다. – givp

답변

18

post_save 신호를 사용하여 보낸 사람 클래스의 개체를 업데이트하는 경우 대신 save 메서드를 재정의해야합니다. 귀하의 경우 모델 정의는 다음과 같습니다.

class Test(models.Model): 
    title = models.CharField('title', max_length=200) 
    blah = models.CharField('blah', max_length=200) 

    def save(self, force_insert=False, force_update=False): 
     if not self.blah: 
      self.blah = 'hello' 
     super(Test, self).save(force_insert, force_update) 
+1

admin 모델에서이 작업을 수행하는 경우 post_save는 기존 관리 모델을 서브 클래스 화하고 save를 재정의하는 것보다 나은 솔루션입니다. –

+0

@ Paul McMillan 이유는 무엇입니까? –

+0

Django 1.3 이상에서 'save'메소드 인수 목록에'using = False'가 필요합니다. – eviltnan

6

post_save 처리기가 인스턴스를 가져 가지 않습니까? 왜 그것을 사용하여 필터링하고 있습니까? 이 루프 때문에

def my_handler(sender, instance=False, created, **kwargs): 
    if created: 
    instance.blah = 'hello' 
    instance.save() 

기존 코드가 작동하지 않으며, Test.objects.filter(id=instance.id) 쿼리 세트가 아닌 객체를 반환 : 왜 그냥 않습니다. 단일 객체를 직접 가져 오려면 Queryset.get()을 사용하십시오. 하지만 여기에서는 할 필요가 없습니다. 생성 된 인수는 루프를 처음부터 설정하기 때문에 반복에서 제외됩니다.

일반적으로 post_save 신호를 절대적으로 사용해야하는 경우가 아니면 어쨌든 개체의 save() 메서드를 재정의해야합니다.

+0

나는 실제로 그것도 아무리 노력해도 노력했다. 위의 사람들이 정확하다면, post_save 루프에 막혀있을 것이므로 어쨌든이 작업을 수행 할 수 없습니다. – givp

+0

작성한 플래그를 사용하여보십시오. 나는 당신의 문제를 고쳐야한다고 생각한다. 왜냐하면 생성 된 것은 후속 루프에서 설정이 해제되기 때문이다. –

+1

신호를 사용할시기와 저장을 무시할시기에 대한 자세한 내용은이 질문을 참조하십시오. http://stackoverflow.com/questions/170337/django-signals-vs-overriding-save-method –