Python 在ManyToManyField中使用交叉引用时出现Django名称错误
我有一个名为models的包,在这个包中,我有几个单独的python文件中的模型。具体而言,目录结构如下所示:Python 在ManyToManyField中使用交叉引用时出现Django名称错误,python,django,manytomanyfield,Python,Django,Manytomanyfield,我有一个名为models的包,在这个包中,我有几个单独的python文件中的模型。具体而言,目录结构如下所示: models/ __init__.py model1.py model2.py models/ __init__.py model1.py model2.py from models import Model1, Model2 在\uuuu init\uuuuu.py中: from model1 import Model1 from
models/
__init__.py
model1.py
model2.py
models/
__init__.py
model1.py
model2.py
from models import Model1, Model2
在\uuuu init\uuuuu.py
中:
from model1 import Model1
from model2 import Model2
from django.db import models
from model2 import Model2
class Model1(models.Model):
field2 = models.ManyToManyFiled(Model2)
from django.db import models
from model1 import Model1
class Model2(models.Model):
field1 = models.ManyToManyFiled(Model1)
#from model1 import Model1
#from model2 import Model2
from django.db import models
class Model1(models.Model):
field2 = models.ManyToManyFiled(Model2)
from model2 import Model2
from django.db import models
class Model2(models.Model):
field1 = models.ManyToManyFiled(Model1)
from model1 import Model1
在model1.py
中:
from model1 import Model1
from model2 import Model2
from django.db import models
from model2 import Model2
class Model1(models.Model):
field2 = models.ManyToManyFiled(Model2)
from django.db import models
from model1 import Model1
class Model2(models.Model):
field1 = models.ManyToManyFiled(Model1)
#from model1 import Model1
#from model2 import Model2
from django.db import models
class Model1(models.Model):
field2 = models.ManyToManyFiled(Model2)
from model2 import Model2
from django.db import models
class Model2(models.Model):
field1 = models.ManyToManyFiled(Model1)
from model1 import Model1
在model2.py
中:
from model1 import Model1
from model2 import Model2
from django.db import models
from model2 import Model2
class Model1(models.Model):
field2 = models.ManyToManyFiled(Model2)
from django.db import models
from model1 import Model1
class Model2(models.Model):
field1 = models.ManyToManyFiled(Model1)
#from model1 import Model1
#from model2 import Model2
from django.db import models
class Model1(models.Model):
field2 = models.ManyToManyFiled(Model2)
from model2 import Model2
from django.db import models
class Model2(models.Model):
field1 = models.ManyToManyFiled(Model1)
from model1 import Model1
通过将import
移动到每个文件的末尾,下面的解决方案可以消除NameError,但我无法从其他地方导入模型
在\uuuu init\uuuuu.py
中:
from model1 import Model1
from model2 import Model2
from django.db import models
from model2 import Model2
class Model1(models.Model):
field2 = models.ManyToManyFiled(Model2)
from django.db import models
from model1 import Model1
class Model2(models.Model):
field1 = models.ManyToManyFiled(Model1)
#from model1 import Model1
#from model2 import Model2
from django.db import models
class Model1(models.Model):
field2 = models.ManyToManyFiled(Model2)
from model2 import Model2
from django.db import models
class Model2(models.Model):
field1 = models.ManyToManyFiled(Model1)
from model1 import Model1
在model1.py
中:
from model1 import Model1
from model2 import Model2
from django.db import models
from model2 import Model2
class Model1(models.Model):
field2 = models.ManyToManyFiled(Model2)
from django.db import models
from model1 import Model1
class Model2(models.Model):
field1 = models.ManyToManyFiled(Model1)
#from model1 import Model1
#from model2 import Model2
from django.db import models
class Model1(models.Model):
field2 = models.ManyToManyFiled(Model2)
from model2 import Model2
from django.db import models
class Model2(models.Model):
field1 = models.ManyToManyFiled(Model1)
from model1 import Model1
在model2.py
中:
from model1 import Model1
from model2 import Model2
from django.db import models
from model2 import Model2
class Model1(models.Model):
field2 = models.ManyToManyFiled(Model2)
from django.db import models
from model1 import Model1
class Model2(models.Model):
field1 = models.ManyToManyFiled(Model1)
#from model1 import Model1
#from model2 import Model2
from django.db import models
class Model1(models.Model):
field2 = models.ManyToManyFiled(Model2)
from model2 import Model2
from django.db import models
class Model2(models.Model):
field1 = models.ManyToManyFiled(Model1)
from model1 import Model1
我希望从其他地方使用以下代码导入模型:
models/
__init__.py
model1.py
model2.py
models/
__init__.py
model1.py
model2.py
from models import Model1, Model2
有什么优雅的方法可以解决这个问题吗?看看。
ManyToManyField必须仅存在于一个模型中,然后在另一个模型中创建一个隐式集,并可以使用后缀_set访问该隐式集。你将有:
class Model1(models.Model):
field2 = models.ManyToManyField(Model2)
class Model2(models.Model):
pass
a = Model1()
b = Model2()
a.field2.add(b)
# Access the sets with:
a.field2.all()
b.model1_set.all()
Django准备使用单个模型文件-每个应用程序-是否不可能将Model1和Model2放在models.py文件中?据我所见,pythonI中的循环模块依赖性不好,它还试图将
Model1
和Model2
放在单个models.py
中。在这种情况下,Model1
和Model2
是交叉引用的,然后在执行python manage.py syncdb
时,我得到namererror
(我使用的是django 1.6.x),您必须将类的名称放在引号中,这样django就可以延迟加载it@Alvaro:它很有效,谢谢!但我最终修改了数据库设计,放弃了ManyToManyField,这不是必须的。完全同意。可能需要补充的是,如果同一文件中有循环外键,则可以将模型的名称放在引号中