2011-11-07 24 views
5

मैं समझता हूँ कि कैसे मॉडल को तोड़ने के लिए, और मैं समझता हूँ कि क्यों परिपत्र मॉड्यूल निर्भरता चीजों को उड़ाने, लेकिन मैं एक समस्या के पार चला गया है जहां अलग फ़ाइलों में एक मॉडल को प्रतीत होता है कि परिपत्र निर्भरताएं होती हैं। यहाँ संहिता से exerpt है, और मैं नाकाम रहने प्रक्रिया से ट्रैस बैक के साथ संपर्क करेंगे:परिपत्र मॉड्यूल निर्भरता

elearning/tasks.py

from celery.task import task 

@task 
def decompress(pk): 
    from elearning.models import Elearning 
    Elearning.objects.get(pk=pk).decompress() 

elearning/models.py

from competency.models import CompetencyProduct 
from core.helpers import ugc_elearning 
from elearning.fields import ArchiveFileField 

class Elearning(CompetencyProduct): 

    archive = ArchiveFileField(upload_to=ugc_elearning) 

    def decompress(self): 

     import zipfile 

     src = self.archive.path 
     dst = src.replace(".zip","") 

     print "Decompressing %s to %s" % (src, dst) 

     zipfile.ZipFile(src).extractall(dst) 

ecom/models/products.py

from django.db import models 
from django.utils.translation import ugettext_lazy as _ 

from core.models import Slugable, Unique 
from django_factory.models import Factory 
from core.helpers import ugc_photos 

class Product(Slugable, Unique, Factory): 

    photo   = models.ImageField(upload_to=ugc_photos, width_field="photo_width", height_field="photo_height", blank=True) 
    photo_width = models.PositiveIntegerField(blank=True, null=True, default=0) 
    photo_height = models.PositiveIntegerField(blank=True, null=True, default=0) 
    description = models.TextField() 
    price   = models.DecimalField(max_digits=16, decimal_places=2) 
    created  = models.DateTimeField(auto_now_add=True) 
    modified  = models.DateTimeField(auto_now=True) 

ecom/models/__init__.py

from django.contrib.auth.models import User 
from django.db import models 

from ecom.models.products import Product, Credit, Subscription 
from ecom.models.permissions import Permission 
from ecom.models.transactions import Transaction, DebitTransaction, CreditTransaction, AwardTransaction, FinancialTransaction, PermissionTransaction, BundleTransaction 

competency/models.py

from django.db import models 
from django.utils.translation import ugettext_lazy as _ 

from core.models import Slugable, Unique 
from ecom.models import Product 
from rating.models import Rated 
from trainer.models import Trainer 

class Competency(Slugable, Unique): 

    class Meta: 
     verbose_name = _("Competency") 
     verbose_name_plural = _("Competencies") 

    description = models.TextField() 



class CompetencyProduct(Product, Rated): 

    class Meta: 
     verbose_name = _("Product") 
     verbose_name_plural = _("Products") 

    release = models.DateField(auto_now_add=True) 

    trainers  = models.ManyToManyField(Trainer) 
    competencies = models.ManyToManyField(Competency, related_name="provided_by") 
    requirements = models.ManyToManyField(Competency, related_name="required_for", blank=True, null=True) 
    forsale  = models.BooleanField("For Sale", default=True) 

ecom/models/permissions.py

from django.contrib.auth.models import User 
from django.db import models 
from django.utils.translation import ugettext_lazy as _ 

from treebeard.mp_tree import MP_Node 

from collective.models import Collective 
from course.models import Course 
from ecom.models.products import Product 

class Permission(MP_Node): 

    class Meta: 
     app_label = "ecom" 

    product  = models.ForeignKey(Product, related_name="permissions") 
    user   = models.ForeignKey(User, related_name="permissions") 
    collective = models.ForeignKey(Collective, null=True) 
    course  = models.ForeignKey(Course, null=True) 
    redistribute = models.BooleanField(default=False) 
    created  = models.DateTimeField(auto_now_add=True) 
    modified  = models.DateTimeField(auto_now=True) 
    accessed  = models.DateTimeField(auto_now=True) 

course/models.py

from django.db import models 
from django.utils.translation import ugettext_lazy as _ 

from competency.models import CompetencyProduct 
from ecom.models import Product 
from rating.models import Rated 

class Chapter(models.Model): 
    seq = models.PositiveIntegerField(name="Sequence", help_text="Chapter number") 
    name = models.CharField(max_length=128) 
    note = models.CharField(max_length=128) 



class Course(Product, Rated): 

    level = models.PositiveIntegerField(choices=CompetencyProduct.LEVELS) 
    chapters = models.ManyToManyField(Chapter) 



class Bundle(models.Model): 

    class Meta: 
     unique_together = (("product", "chapter"),) 

    product = models.ForeignKey(Product, related_name="bundles") 
    chapter = models.ForeignKey(Chapter, related_name="bundles") 
    amount = models.PositiveIntegerField() 
    seq  = models.PositiveIntegerField(name="Sequence", default=1) 

मैं क्या देख सकते हैं से, वहाँ कोई स्पष्ट परिपत्र प्रत्यावर्तन है वह पुनः, __init__.py में आवश्यक संदर्भों के लिए सहेजें, ऐसा लगता है कि मेरे कोड में चीजें उड़ रही हैं। यहाँ ट्रैस है:

File "/path/to/project/virtualenv/lib/python2.6/site-packages/celery/execute/trace.py", line 47, in trace 
    return cls(states.SUCCESS, retval=fun(*args, **kwargs)) 
    File "/path/to/project/virtualenv/lib/python2.6/site-packages/celery/app/task/__init__.py", line 247, in __call__ 
    return self.run(*args, **kwargs) 
    File "/path/to/project/virtualenv/lib/python2.6/site-packages/celery/app/__init__.py", line 175, in run 
    return fun(*args, **kwargs) 
    File "/path/to/project/django/myproj/elearning/tasks.py", line 5, in decompress 
    from elearning.models import Elearning 
    File "/path/to/project/django/myproj/elearning/models.py", line 2, in <module> 
    from competency.models import CompetencyProduct 
    File "/path/to/project/django/myproj/competency/models.py", line 5, in <module> 
    from ecom.models import Product 
    File "/path/to/project/django/myproj/ecom/models/__init__.py", line 5, in <module> 
    from ecom.models.permissions import Permission 
    File "/path/to/project/django/myproj/ecom/models/permissions.py", line 8, in <module> 
    from course.models import Course 
    File "/path/to/project/django/myproj/course/models.py", line 4, in <module> 
    from competency.models import CompetencyProduct 
ImportError: cannot import name CompetencyProduct 

सभी मैं यहाँ करने के लिए कोशिश कर रहा हूँ आयात है कि Elearning मॉडल है, जो CompetencyProduct का एक उपवर्ग है, और बदले में, Product। हालांकि, Product बड़े ecom/models.py के ब्रेक-अप से आता है, ecom/__init__.py फ़ाइल में Permission समेत सभी टूटा हुआ मॉडल का अनिवार्य आयात होता है, जिसमें Course आयात करना होता है जिसके लिए CompetencyProduct की आवश्यकता होती है।

निराला बात यह है कि पूरी साइट pefectly काम करता है। लॉगिन, खरीद, सबकुछ। यह समस्या तब होती है जब मैं पृष्ठभूमि में अजवाइन चलाने की कोशिश कर रहा हूं और एक नया कार्य लोड हो गया है या मैं Django पर्यावरण का उपयोग करके एक खोल स्क्रिप्ट चलाने की कोशिश करता हूं।

ecom ऐप से Permission को निकालने का मेरा एकमात्र विकल्प है, या इसे संभालने का एक बेहतर, बेहतर तरीका है? इसके अतिरिक्त, सामान्य रूप से परियोजना को कैसे प्रस्तुत किया गया है, इस पर कोई टिप्पणी की सराहना की जाती है।

+0

एक सरलीकृत उदाहरण है * * समस्या को वर्णन नहीं करता क्यों दे रही है परेशान? आप सही हे; वहां कोई परिपत्र निर्भरता नहीं है, लेकिन आपके वास्तविक कोड में * है * है। आपको वास्तविक कोड पोस्ट करें, आप जो कुछ भी लागू नहीं करते हैं उसे पुन: सक्रिय कर सकते हैं, लेकिन यह देखने में मदद मिलेगी कि आपकी परियोजना में आपकी वास्तविक फाइलें और मॉडल कैसे निर्धारित किए गए हैं। –

+0

आप सही हैं। मैंने इसे अभी बदल दिया है। –

उत्तर

3

आपकी समस्या यह है कि Permission आयात Product, लेकिन दोनों ecom/models/__init__.py में आयात किए जाते हैं। आपको इन दोनों मॉडलों को एक ही फाइल में रखने का तरीका मिलना चाहिए या उन्हें दो ऐप्स में अलग करना चाहिए।

+0

बात है, मैं नहीं वास्तव में * आवश्यकता * 'में उन मॉडलों __init __। Py', syncdb मॉडल खोजने के लिए और उन्हें स्थापित करने के लिए के लिए के अलावा अन्य है।मुझे लगता है मैं एक तरह से पहली जगह में है कि फाइल में उन लोगों के आयात डालने से बचने के लिए खोजने के लिए उम्मीद कर रहा था। –

+1

संभव नहीं है। Django के साथ व्यक्तिगत फ़ाइलों में अपने मॉडल को बाहर निकालने का यही एकमात्र तरीका है। उन आयात, '__init __। Py' में होना चाहिए, ताकि अनिवार्य रूप से, आप एक ही अनुप्रयोग के भीतर पार आयात नहीं कर सकते। यदि एक ही ऐप में दो मॉडल एक-दूसरे की ज़रूरत है, तो उन्हें एक ही फाइल में होना चाहिए। –

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