带有模型的Django错误(ManyToManyField)

带有模型的Django错误(ManyToManyField),django,django-models,Django,Django Models,我使用django构建应用程序,但在models.py文件中出现以下错误: creator = models.ManyToManyField(Teacher, on_delete=models.CASCADE) NameError: name 'Teacher' is not defined 这是我在models.py中的当前代码: from django.db import models from django.contrib.auth.models import User # Create

我使用django构建应用程序,但在models.py文件中出现以下错误:

creator = models.ManyToManyField(Teacher, on_delete=models.CASCADE)
NameError: name 'Teacher' is not defined
这是我在models.py中的当前代码:

from django.db import models
from django.contrib.auth.models import User
# Create your models here.

class School(models.Model):
    nombre = models.CharField(max_length=355)
    profesoras = models.ManyToManyField(Teacher)

class Teacher(models.Model):
    user = models.ForeignKey(User, related_name="teacherClass", blank=False)
    school = models.ManyToManyField(School, blank=True)
class Post(models.Model):
    creator = models.ManyToManyField(Teacher, on_delete=models.CASCADE)
    title = models.CharField(max_length=255)
    text = models.TextField(max_length=2000)

您知道如何解决此错误吗?

此错误很好,因为您在声明之前正在使用它,而且您的关系有点混乱。你可以说,在这个应用程序中,你可以拥有你想要的任意多所学校,每个教授在多所学校任教,因此,通过使用多对多关系,可以是这样的:

class School(models.Model):
    name = models.CharField(max_length=355)


class Teacher(models.Model):
    user = models.ForeignKey(User, related_name="teacherClass", blank=False, on_delete=models.CASCADE)
    school = models.ManyToManyField(School, blank=True)


class Post(models.Model):
    creator = models.ManyToManyField(Teacher)
    title = models.CharField(max_length=255)
    text = models.TextField(max_length=2000)

我建议您稍微研究一下数据库中的关系,这样以后就不会有任何类似的问题。

错误很好,因为您在声明之前使用了它,而且您的关系有点混乱。你可以说,在这个应用程序中,你可以拥有你想要的任意多所学校,每个教授在多所学校任教,因此,通过使用多对多关系,可以是这样的:

class School(models.Model):
    name = models.CharField(max_length=355)


class Teacher(models.Model):
    user = models.ForeignKey(User, related_name="teacherClass", blank=False, on_delete=models.CASCADE)
    school = models.ManyToManyField(School, blank=True)


class Post(models.Model):
    creator = models.ManyToManyField(Teacher)
    title = models.CharField(max_length=255)
    text = models.TextField(max_length=2000)

我建议您研究一下数据库中的关系,这样以后就不会有类似的问题了。

这里的问题是您试图引用一个尚未创建的模型。Django声明在这种情况下该怎么办

如果需要在尚未创建的模型上创建关系 定义后,可以使用模型的名称,而不是模型 对象本身:


class Car(models.Model):
    manufacturer = models.ForeignKey(
        'Manufacturer',
        on_delete=models.CASCADE,
    )
    # ...

class Manufacturer(models.Model):
    # ...
    pass 
因此,对于您的情况,您只需将模型关系更改为字符串

from django.db import models
from django.contrib.auth.models import User
# Create your models here.

class School(models.Model):
    nombre = models.CharField(max_length=355)
    profesoras = models.ManyToManyField("Teacher") # Make this a string because it has not been defined yet

class Teacher(models.Model):
    user = models.ForeignKey(User, related_name="teacherClass", blank=False)
    school = models.ManyToManyField(School, blank=True) 


class Post(models.Model):
    creator = models.ManyToManyField("Teacher", on_delete=models.CASCADE) # Same with this one.
    title = models.CharField(max_length=255)
    text = models.TextField(max_length=2000)

django文档总是非常有用,并且有很多好的信息。

这里的问题是您试图引用一个尚未创建的模型。Django声明在这种情况下该怎么办

如果需要在尚未创建的模型上创建关系 定义后,可以使用模型的名称,而不是模型 对象本身:


class Car(models.Model):
    manufacturer = models.ForeignKey(
        'Manufacturer',
        on_delete=models.CASCADE,
    )
    # ...

class Manufacturer(models.Model):
    # ...
    pass 
因此,对于您的情况,您只需将模型关系更改为字符串

from django.db import models
from django.contrib.auth.models import User
# Create your models here.

class School(models.Model):
    nombre = models.CharField(max_length=355)
    profesoras = models.ManyToManyField("Teacher") # Make this a string because it has not been defined yet

class Teacher(models.Model):
    user = models.ForeignKey(User, related_name="teacherClass", blank=False)
    school = models.ManyToManyField(School, blank=True) 


class Post(models.Model):
    creator = models.ManyToManyField("Teacher", on_delete=models.CASCADE) # Same with this one.
    title = models.CharField(max_length=255)
    text = models.TextField(max_length=2000)

django文档总是非常有用,并且有很多好的信息。

Teacher
模型和
Post
模型之间添加新行。在
Teacher
模型和
Post
模型之间添加新行。