2011-09-20 2 views
1

이것은 매우 간단합니다.Django admin model save - 기존 객체 업데이트

내 모델에서 save() 나는 기본적으로 get_or_create()을하고 싶습니다. 그래서 모델이 존재한다면 그것을 업데이트하고 그렇지 않다면 새로운 모델을 만들고 싶습니다.

이것은 매우 간단한 문제처럼 보입니다.하지만 제대로 이해하지 못합니다!

class StockLevel(models.Model): 
    stock_item = models.ForeignKey(StockItem) 
    current_stock_level = models.IntegerField(blank=True, default=0) 

    def save(self): 
     try: 
      # it exists 
      a = StockLevel.objects.get(stock_item=self.stock_item) 
      a.current_stock_level = self.current_stock_level 
      a.save() 

     except: 
      # is does not exist yet 
      # save as normaly would. 
      super(StockLevel, self).save() 

또는

def save(self): 
    stock_level_item , created = StockLevel.objects.get_or_create(stock_item=self.stock_item) 
    stock_level_item.current_stock_level = self.current_stock_level 
    stock_level_item.save() 

이 또한 무한 루프에 갈 것입니다.

이렇게하면 save()가 무한 루프에 놓이게됩니다. 하지만 그것이 어떻게 작동해야하는지에 대한 기본적인 생각입니다.

+0

일부 코드를 표시하십시오. –

답변

5

장고는 개체 생성 및 업데이트를 위해 save() 메서드를 사용합니다. 사용자 코드는 메서드 자체로 수행되므로 개체를 만들거나 업데이트할지 여부를 결정할 필요가 없습니다.

또한 save() 메서드는 선택적 인수를 사용하여 개체를 만들거나 업데이트 할 수 있습니다.

이 내용은 Django docs에 있습니다.

+2

또한 객체가 이전에 저장되었는지 여부를 확인하려면'save()'메소드에 기본 키가 있는지 확인할 수 있습니다. 'if self.pk : ... '의 줄을 따라 뭔가. 그러나 gagamil이 update vs insert에 대한 답변을 Django 자체에서 처리했습니다. – modocache

1

이 작업을 수행하는 가장 좋은 방법은 아닙니다. save 메소드는 현재 인스턴스를 저장하기위한 것이지 마술처럼 기존 인스턴스를 조회하는 것이 아닙니다. 양식이나보기 코드에서이를 처리해야합니다.