2011-11-12 19 views
8

मेरी models.py में से अजवाइन के माध्यम से एक कार्य निष्पादितDjango एक मॉडल

    :

    from celery.decorators import task 
    from core.models import Image 
    
    @task() 
    def create_thumbnail(image_id): 
        ImageObj = Image.objects.get(id=image_id) 
        # other stuff here 
    

    यह निम्न लौटा रहा है

  • अपवाद प्रकार: आयात त्रुटि
  • अपवाद मान: नाम कार्यों

त्रुटि गायब हो अगर मैं tasks.py में from core.models import Image बाहर टिप्पणी के बाद से Image यहाँ में कोई मतलब नहीं है लेकिन इस स्पष्ट रूप से एक समस्या का कारण होगा आयात नहीं कर सकते। मैंने इसे create_thumbnail के अंदर आयात करने का प्रयास किया है, हालांकि यह अभी भी Image को पहचान नहीं पाएगा।

मैंने कहीं पढ़ा है कि आमतौर पर ऑब्जेक्ट को किसी कार्य के लिए तर्क के रूप में पारित किया जा सकता है और यह मेरी समस्या का समाधान करेगा। हालांकि, एक दोस्त ने मुझे एक बार कहा था कि इसे एक खरगोश एमक्यू संदेश में जितना संभव हो उतना डेटा भेजने के लिए सबसे अच्छा अभ्यास माना जाता है, ताकि यह प्राप्त किया जा सके कि मैं केवल छवि आईडी पास करने की कोशिश कर रहा हूं और फिर इसे फिर से कार्य में पुनः प्राप्त कर रहा हूं।

1) क्या मैं सबसे अच्छा अभ्यास करने की कोशिश कर रहा हूं? यदि हां, तो मैं इसे कैसे काम करूं?

2) मैंने वेब के चारों ओर मिले सभी उदाहरणों में ध्यान दिया है, वे कार्य को एक दृश्य से निष्पादित करते हैं और मॉडल से कभी नहीं। जब भी कोई नई छवि अपलोड की जाती है, तो मैं थंबनेल बनाने की कोशिश कर रहा हूं, मैं अपने फॉर्म/व्यू में create_thumbnail को कॉल नहीं करना चाहता हूं। इसके बारे में कोई विचार? एक मॉडल से एक कार्य निष्पादित या अनुशंसित एक सामान्य अभ्यास है?

उत्तर

13

1) Is what I'm trying to do considered a best practice? If yes, how do I work it out?

हाँ बदलने, कार्य करने के लिए केवल एक छोटे से जानकारी गुजर प्रयास करें।

2) I have noticed in all the examples I found around the web, they execute the task from a view and never from a model. I'm trying to create a thumbnail whenever a new image is uploaded, I don't want to call create_thumbnail in every form/view I have. Any idea about that? Is executing a task from a model not recommended or a common practice?

मैं एक ही बात ध्यान दिया है, और लगता है कि ट्यूटोरियल और उनके विचारों से प्रलेखन कॉल कार्यों क्योंकि यह प्रदर्शित करने के लिए कैसे चीजें मॉडल या रूपों के साथ की तुलना में सरल विचारों का उपयोग करके काम आसान है।

परिपत्र आयात को खत्म करने के लिए, आपको इस बारे में सोचना चाहिए कि आयात किस तरह से होना चाहिए। आम तौर पर, task.py को models.py से कई चीजें आयात करने की आवश्यकता होगी जबकि models.py को शायद ही कभी actions.py के बारे में कुछ भी पता होना चाहिए। मानक होना चाहिए कि models.py task.py से आयात नहीं करता है।

from django.db import models 

class Image(models.Model): 
    image  = models.ImageField(upload_to='images/orig') 
    thumbnail = models.ImageField(upload_to='images/thumbnails', editable=False) 

    def save(self, *args, **kwargs): 
     super(Image, self).save(*args, **kwargs) 
     from core.tasks import create_thumbnail 
     create_thumbnail.delay(self.id) 
+1

मैंने वास्तव में अनुच्छेद की सराहना की" परिपत्र आयात को खत्म करने के लिए, आपको इस बारे में सोचना चाहिए कि आयात किस तरह से होना चाहिए ... "। धन्यवाद। – pawelmech

1

मुझे आश्चर्य है कि समस्या एक परिपत्र आयात (models और tasks शीर्ष स्तर पर एक-दूसरे को आयात कर सकती है)। आम तौर पर एक अच्छी बात है आप की तरह उल्लेख किया है "from core.models import Image" create_thumbnail में जाने से, यानी tasks

को
from celery.decorators import task 

@task() 
def create_thumbnail(image_id): 
    from core.models import Image 
    ImageObj = Image.objects.get(id=image_id) 
    # other stuff here 
+0

मैं पहले से ही की कोशिश की है इस मामले में संदेश भेजा जाता है कि, सही ढंग से हालांकि create_thumbnail एक त्रुटि उत्पन्न करता है उपयोग करने का प्रयास 5, create_thumbnail' 'कोर.मोडल्स आयात से छवि' 'नाम त्रुटि: वैश्विक नाम' छवि 'परिभाषित नहीं किया गया है' – abstractpaper

+0

मुझे लगता है कि 'कोर' आपके ऐप का नाम है। क्या आपने प्रोजेक्ट नाम (यानी 'project.app.models आयात मॉडल' से प्रीपेड करने का प्रयास किया है? django कुछ पथ जादू करता है जो कभी-कभी सहायक से कम होता है – second

+0

बस किया गया, वही त्रुटि लौटा दी: 'नाम त्रुटि: वैश्विक नाम 'छवि' परिभाषित नहीं किया गया है। मैंने पहले ही अपने प्रोजेक्ट पथ को 'django.wsgi' में जोड़ा है। – abstractpaper

4

आप कार्य ही आयात करने की आवश्यकता नहीं है: इस प्रकार, यदि आप ऐसा करने की क्या ज़रूरत है और एक मॉडल विधि से कोई कार्य बुला रहे हैं, विधि के रूप में तो में आयात किया जाता है। `फ़ाइल" /home/ubuntu/project/core/tasks.py ", लाइन: निम्नलिखित

from django.db import models 
from celery.execute import send_task, delay_task 

class Image(models.Model): 
    image  = models.ImageField(upload_to='images/orig') 
    thumbnail = models.ImageField(upload_to='images/thumbnails', editable=False) 

    def save(self, *args, **kwargs): 
     super(Image, self).save(*args, **kwargs) 
     result = delay_task("task_prefix.create_thumbnail", post.id) 
+1

celery.execute celery 3.x में अब मौजूद नहीं प्रतीत होता है – Titusz

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