两种模型之间的Django关系

时间:2018-12-07 20:42:41

标签: django

我是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

1 个答案:

答案 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

Django的反向关系

对于这个特定的应用程序,似乎您在SectionArticle之间建立了双重关系,这基本上是一个关系,您应该做到这一点,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()