2012-07-12 10 views
8

मैं अपने मॉडलों में से एक पर विधि बचाने अधिभावी कर रहा हूँ:कस्टम मॉडल पर विधि को बचाने - 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] 

हालांकि, मैं केवल एक बार set_coords() चलाना चाहते हैं, जब पद बनाया जा रहा है। मॉडल को अद्यतन होने पर यह फ़ंक्शन नहीं चलना चाहिए।

मैं इसे कैसे पूरा कर सकता हूं? मॉडल का निर्माण या अद्यतन किया जा रहा है या नहीं, इसका पता लगाने का कोई तरीका है?

उत्तर

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

क्या आप मुझे बता सकते हैं कि। वापसी का उपयोग लाइन 'सुपर (पोस्ट, सेल्फ)। सेव (* args, ** kwargs) पर किया जाना चाहिए या नहीं। यह बदले बिना काम करता है। –

+0

बिल्कुल सही! बहुत अच्छा जवाब। –

4

मुझे लगता है कि यह करने के लिए सही तरीका 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

मैं कहूंगा कि सिग्नल उन मॉडलों के व्यवहार को बदलने के लिए एक बेहतर कॉल है जिनके पास हमारे पास पहुंच नहीं है। किसी भी तरह से उपयोगी होने के बावजूद। ;) –

संबंधित मुद्दे