2012-07-12 37 views
8

Tôi trọng các phương pháp tiết kiệm trên một trong những mô hình của tôi:tùy chỉnh phương pháp tiết kiệm trên mô hình - django

def save(self, *args, **kwargs): 
    self.set_coords() 
    super(Post, self).save(*args, **kwargs) 

def __unicode__(self): 
    return self.address 

# set coordinates 
def set_coords(self): 
    toFind = self.address + ', ' + self.city + ', ' + \ 
     self.province + ', ' + self.postal 

    (place, location) = g.geocode(toFind) 

    self.lat = location[0] 
    self.lng = location[1] 

Tuy nhiên, tôi chỉ muốn chạy set_coords() một lần, khi bài đã được tạo ra. Chức năng này không nên chạy khi mô hình đang được cập nhật.

Tôi làm cách nào để thực hiện việc này? Có cách nào để phát hiện nếu mô hình đang được tạo hoặc cập nhật không?

Trả lời

24
def save(self, *args, **kwargs): 
    if not self.pk: 
     self.set_coords() 
    super(Post, self).save(*args, **kwargs) 
+0

bạn có thể vui lòng cho tôi biết rằng. Trả về nên được sử dụng hoặc không phải trên dòng 'super (Post, self) .save (* args, ** kwargs)'. Nó hoạt động mà không trở lại. –

+0

Hoàn hảo! Câu trả lời rất hay. –

4

Tôi nghĩ rằng cách chính xác để làm điều đó là sử dụng tín hiệu post_save:

def set_coords(sender, **kw): 
    model_instance = kw["instance"] 
    if kw["created"]: 
     toFind = model_instance.address + ', ' + model_instance.city + ', ' + \ 
     model_instance.province + ', ' + model_instance.postal 
     (place, location) = g.geocode(toFind) 
     model_instance.lat = location[0] 
     model_instance.lng = location[1] 
     model_instance.save() 
post_save.connect(set_coords, sender=MyModel) 
+0

Tôi sẽ nói rằng các tín hiệu là cuộc gọi tốt hơn để thay đổi hành vi của các mô hình mà chúng tôi không có quyền truy cập. Mặc dù là hữu ích một trong hai cách. ;) –

Các vấn đề liên quan