我是Django的新手。
能否请您提供一个模型样本,说明如何将两个模型相互关联。
-以下是截面模型
from articles.models import Article
# Create your models here.
class Section(models.Model):
#associations
user = models.ForeignKey(settings.AUTH_USER_MODEL)
article = models.ForeignKey(Article) #Article
-下面是Article模型
from sections.models import Section
User = settings.AUTH_USER_MODEL
# Create your models here.
class Article(models.Model):
owner =models.ForeignKey(User, null=False)
sections = models.ManyToManyField( Section )
但是。我收到以下错误: ValueError:无法为“商品”创建表单字段,因为尚未加载其相关模型“ articles.models”
谢谢所有
B
答案 0 :(得分:4)
您定义了循环导入:一个模块首先必须导入另一个模块,但是另一个模块必须实现该模块,因此您定义了一个循环。
在Django中,不是本身必须使用类引用来制作ForeignKey
,一个人可以使用引用正确模型的 strings 。在这种情况下,Django框架将在以后解决这些问题。
所以我们可以打破循环,例如:
# sections/models.py
# no import from articles
# Create your models here.
class Section(models.Model):
#associations
user = models.ForeignKey(settings.AUTH_USER_MODEL)
# we use a string literal
article = models.ForeignKey('articles.Article', on_delete=models.CASCADE)
,然后在articles/models.py
中:
# articles/models.py
from sections.models import Section
User = settings.AUTH_USER_MODEL
# Create your models here.
class Article(models.Model):
owner = models.ForeignKey(User, null=False)
sections = models.ManyToManyField(Section)
因此在这里,我们不再在articles/models.py
中导入sections/models.py
,因此我们中断了循环导入。
请注意,您需要为on_delete
指定一个ForeignKey
,例如models.CASCADE
。
对于这个特定的应用程序,似乎您在Section
和Article
之间建立了双重关系,这基本上是一个关系,您应该不做到这一点,Django自动编写反向关系,您可能想做的就是给它取一个适当的名称,例如:
# sections/models.py
# no import from articles
# Create your models here.
class Section(models.Model):
#associations
user = models.ForeignKey(settings.AUTH_USER_MODEL)
# we use a string literal
article = models.ForeignKey(
'articles.Article',
on_delete=models.CASCADE,
related_name='sections'
)
和articles/models.py
:
# articles/models.py
User = settings.AUTH_USER_MODEL
# Create your models here.
class Article(models.Model):
owner = models.ForeignKey(User, null=False)
# no relation to section
在这里,我们可以使用Section
获得与some_article
相关的所有some_article.sections.all()
。