2011-05-30 16 views
12

मैं सेलेरी के साथ एसिंक्रोनस कार्य को कॉल करने के लिए मॉडल की बचत() विधि को ओवरराइड कर रहा हूं। यह कार्य मॉडल को भी बचाता है, और इसलिए मैं एक पुनरावर्ती स्थिति के साथ समाप्त होता हूं जहां सेलेरी कार्य को बार-बार कहा जाता है। कोड यह रहा:Django मॉडल फ़ील्ड्स को अद्यतन करने के लिए अजवाइन का उपयोग करते समय रिकर्सिव सेव() से बचें

मॉडल की विधि को बचाने:

def save(self, *args, **kwargs): 
    super(Route, self).save(*args, **kwargs) 
    from .tasks import get_elevation_data 
    get_elevation_data.delay(self) 

get_elevation_data कार्य:

from celery.decorators import task 

@task() 
def get_elevation_data(route): 
    ... 
    route.elevation_data = results 
    route.save() 

मैं इस प्रत्यावर्तन कैसे बच सकते हैं?

उत्तर

14

recurse के लिए नहीं एक कीवर्ड तर्क यह है कि बचाने बताता जोड़ें:

def save(self, elevation_data=True, *args, **kwargs): 
    super(Route, self).save(*args, **kwargs) 
    if elevation_data: 
    from .tasks import get_elevation_data 
    get_elevation_data.delay(self) 

और फिर:

from celery.decorators import task 

@task() 
def get_elevation_data(route): 
    ... 
    route.elevation_data = results 
    route.save(elevation_data=False)