मैं समझता हूँ कि कैसे मॉडल को तोड़ने के लिए, और मैं समझता हूँ कि क्यों परिपत्र मॉड्यूल निर्भरता चीजों को उड़ाने, लेकिन मैं एक समस्या के पार चला गया है जहां अलग फ़ाइलों में एक मॉडल को प्रतीत होता है कि परिपत्र निर्भरताएं होती हैं। यहाँ संहिता से 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
को निकालने का मेरा एकमात्र विकल्प है, या इसे संभालने का एक बेहतर, बेहतर तरीका है? इसके अतिरिक्त, सामान्य रूप से परियोजना को कैसे प्रस्तुत किया गया है, इस पर कोई टिप्पणी की सराहना की जाती है।
एक सरलीकृत उदाहरण है * * समस्या को वर्णन नहीं करता क्यों दे रही है परेशान? आप सही हे; वहां कोई परिपत्र निर्भरता नहीं है, लेकिन आपके वास्तविक कोड में * है * है। आपको वास्तविक कोड पोस्ट करें, आप जो कुछ भी लागू नहीं करते हैं उसे पुन: सक्रिय कर सकते हैं, लेकिन यह देखने में मदद मिलेगी कि आपकी परियोजना में आपकी वास्तविक फाइलें और मॉडल कैसे निर्धारित किए गए हैं। –
आप सही हैं। मैंने इसे अभी बदल दिया है। –