2015-05-24 5 views
1

Я не понимаю, если это возможно, использует связь между моделью, которая использует общий экземпляр, например, у меня есть модель Процедура, который использует класс называет Площадь, и этот класс (Area) используется внутри модели счета-фактуры, который нуждается экземпляр ConceptDetail и нуждается в Площади класс, тем не менее Процедуры класс зависит от экземпляра фактуры, поэтому класс Процедуры используют класс Площади и Номер счета.Django наследования, отношения между классами, которые напрямую/косвенно же класса

Моя схема Пример

Procedure (depends of) Area, Invoice

Invoice (depends of) ConceptDetail (who depends of) Area

Когда я пытаюсь это, я получаю ImportError: cannot import name 'Area', если я удалить отношения процедуры и счет-фактуру он отлично работает, это моя ошибка, отношения, созданные ?, я думаю мое исправление создало новый класс Area для класса ConceptDetail, плохие ли данные внутри него будут дублированы и подумают, что это неправильно?

Это мой код

# from procedure models.py 
from invoice.model import Invoice 
class Area(CreateUpdateMixin): 
    name = models.CharField(max_length=75, verbose_name=_('Area')) 
    renovated = models.BooleanField(default=False) 
    requested = models.BooleanField(default=False) 
def __str__(self): 
    return self.name 

class Meta: 
    verbose_name = _('Area') 
    verbose_name_plural = _('Areas') 

class Procedure(CreateUpdateMixin): 

    title = models.CharField(max_length=150, verbose_name=_('Titulo')) 
    area = models.ForeignKey(Area, verbose_name=_('Area'), related_name='areas') 
    figure = models.ForeignKey(Figure, verbose_name=_('Figura'), blank=True, null=True) 
    linked = models.ManyToManyField("self", verbose_name=_('Relacionados'), blank=True) 

    # invoices.invoice 
    invoices = models.ManyToManyField(Invoice, verbose_name=_('Facturas'), blank=True) 

# from invoice models.py 
from procedure.models import Area 
class ConceptDetail(CreateUpdateMixin): 
    name = models.CharField(max_length=150) 
    area = models.ForeignKey(Area, verbose_name=_('Aplica al Area')) 
    concept = models.CharField(max_length=150) 
    fee = models.FloatField() 
    duty = models.FloatField() 

class Invoice(CreateUpdateMixin): 

    # 
    invoice = models.CharField(max_length=15, verbose_name=_('Número de Factura')) 
    date = models.DateField(verbose_name=_('Fecha')) # YYYYMMDD 
    status = models.ForeignKey(StatusInvoice, null=True, blank=True) 

от сессии invoice_detail = models.ManyToManyField (InvoiceDetail, пустой = True)

# from settings.py 
INSTALLED_APPS = (
    'procedure', 
    'invoice', 
) 

и сломал мое приложение, это ошибка:

> Traceback (most recent call last): 
    File "/Applications/PyCharm.app/Contents/helpers/pycharm/django_manage.py", line 41, in <module> 
    run_module(manage_file, None, '__main__', True) 
    File "/usr/local/Cellar/python3/3.4.3/Frameworks/Python.framework/Versions/3.4/lib/python3.4/runpy.py", line 182, in run_module 
    return _run_module_code(code, init_globals, run_name, mod_spec) 
    File "/usr/local/Cellar/python3/3.4.3/Frameworks/Python.framework/Versions/3.4/lib/python3.4/runpy.py", line 96, in _run_module_code 
    mod_name, mod_spec, pkg_name, script_name) 
    File "/usr/local/Cellar/python3/3.4.3/Frameworks/Python.framework/Versions/3.4/lib/python3.4/runpy.py", line 85, in _run_code 
    exec(code, run_globals) 
    File "/Volumes/iMac/Users/paridin/Devel/python/pyppm/manage.py", line 10, in <module> 
    execute_from_command_line(sys.argv) 
    File "/Volumes/iMac/Users/paridin/.virtualenvs/pyppm/lib/python3.4/site-packages/django/core/management/__init__.py", line 338, in execute_from_command_line 
    utility.execute() 
    File "/Volumes/iMac/Users/paridin/.virtualenvs/pyppm/lib/python3.4/site-packages/django/core/management/__init__.py", line 312, in execute 
    django.setup() 
    File "/Volumes/iMac/Users/paridin/.virtualenvs/pyppm/lib/python3.4/site-packages/django/__init__.py", line 18, in setup 
    apps.populate(settings.INSTALLED_APPS) 
    File "/Volumes/iMac/Users/paridin/.virtualenvs/pyppm/lib/python3.4/site-packages/django/apps/registry.py", line 108, in populate 
    app_config.import_models(all_models) 
    File "/Volumes/iMac/Users/paridin/.virtualenvs/pyppm/lib/python3.4/site-packages/django/apps/config.py", line 198, in import_models 
    self.models_module = import_module(models_module_name) 
    File "/Volumes/iMac/Users/paridin/.virtualenvs/pyppm/lib/python3.4/importlib/__init__.py", line 109, in import_module 
    return _bootstrap._gcd_import(name[level:], package, level) 
    File "<frozen importlib._bootstrap>", line 2254, in _gcd_import 
    File "<frozen importlib._bootstrap>", line 2237, in _find_and_load 
    File "<frozen importlib._bootstrap>", line 2226, in _find_and_load_unlocked 
    File "<frozen importlib._bootstrap>", line 1200, in _load_unlocked 
    File "<frozen importlib._bootstrap>", line 1129, in _exec 
    File "<frozen importlib._bootstrap>", line 1471, in exec_module 
    File "<frozen importlib._bootstrap>", line 321, in _call_with_frames_removed 
    File "/Volumes/iMac/Users/paridin/Devel/python/pyppm/registration/models.py", line 4, in <module> 
    from procedure.models import Area 
    File "/Volumes/iMac/Users/paridin/Devel/python/pyppm/procedure/models.py", line 8, in <module> 
    from invoice.models import Invoice 
    File "/Volumes/iMac/Users/paridin/Devel/python/pyppm/invoice/models.py", line 5, in <module> 
    from procedure.models import Area 
ImportError: cannot import name 'Area' 

ответ

2

Вы делаете круговый импорт, импортировав from invoice.model import Invoice в procedure/models.py и from procedure.models import Area в invoice/models.py.

Измените код следующим образом:

# procedure/models.py: 
class Procedure(CreateUpdateMixin): 
    ... 
    # invoices.invoice as a string: 
    invoices = models.ManyToManyField('invoice.Invoice', 
             verbose_name=_('Facturas'), blank=True) 

Основная концепция заключается в изменении класса referencies в строки. Это позволяет иметь круговые зависимости. Вы можете сделать это и в invoice/models.py.

+0

Спасибо, мне нужно ознакомиться с круговыми ввозами, я не знал, как вы помогаете мне так много. – paridin

Смежные вопросы