Django 继承,class 依赖 directly/indirectly 的 class 之间的关系
Django inheritance, relationship between classes who depends directly/indirectly of same class
我不明白是否可以使用使用共享实例的模型之间的关系,例如我有一个 过程模型 使用 class 调用 Area,而这个 class ( Area) 用于 发票模型 需要 [= 的实例29=]ConceptDetail 并且它需要 区域 class,但是 过程class依赖于Invoice的实例,所以程序class使用区域class和发票class.
我的图表示例
Procedure (depends of) Area, Invoice
Invoice (depends of) ConceptDetail (who depends of) Area
当我尝试这个时,我得到一个 ImportError: cannot import name 'Area'
,如果我删除 Procedure 和 Invoice 的关系它工作正常,这是我的错误,关系创建?,我想我的修复是创建一个新的区域class 对于ConceptDetail class,不好的是里面的数据会重复,觉得这样不对吧?
这是我的代码
# 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)
来自 session
invoice_detail = models.ManyToManyField(发票详细信息,空白=真)
# 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'
您正在通过在 procedure/models.py
中导入 from invoice.model import Invoice
和在 invoice/models.py
中导入 from procedure.models import Area
来进行循环导入。
像这样更改您的代码:
# procedure/models.py:
class Procedure(CreateUpdateMixin):
...
# invoices.invoice as a string:
invoices = models.ManyToManyField('invoice.Invoice',
verbose_name=_('Facturas'), blank=True)
主要概念是将 class 引用更改为字符串。它使循环依赖成为可能。您也可以在 invoice/models.py
中执行此操作。
我不明白是否可以使用使用共享实例的模型之间的关系,例如我有一个 过程模型 使用 class 调用 Area,而这个 class ( Area) 用于 发票模型 需要 [= 的实例29=]ConceptDetail 并且它需要 区域 class,但是 过程class依赖于Invoice的实例,所以程序class使用区域class和发票class.
我的图表示例
Procedure (depends of) Area, Invoice
Invoice (depends of) ConceptDetail (who depends of) Area
当我尝试这个时,我得到一个 ImportError: cannot import name 'Area'
,如果我删除 Procedure 和 Invoice 的关系它工作正常,这是我的错误,关系创建?,我想我的修复是创建一个新的区域class 对于ConceptDetail class,不好的是里面的数据会重复,觉得这样不对吧?
这是我的代码
# 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)
来自 session invoice_detail = models.ManyToManyField(发票详细信息,空白=真)
# 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'
您正在通过在 procedure/models.py
中导入 from invoice.model import Invoice
和在 invoice/models.py
中导入 from procedure.models import Area
来进行循环导入。
像这样更改您的代码:
# procedure/models.py:
class Procedure(CreateUpdateMixin):
...
# invoices.invoice as a string:
invoices = models.ManyToManyField('invoice.Invoice',
verbose_name=_('Facturas'), blank=True)
主要概念是将 class 引用更改为字符串。它使循环依赖成为可能。您也可以在 invoice/models.py
中执行此操作。