【问题标题】:Django NameError: name 'Character' is not definedDjango NameError:未定义名称“字符”
【发布时间】:2020-02-24 10:16:37
【问题描述】:

我的模特是

class Movie(models.Model):
    name = models.CharField(max_length=10)
    characters = models.ManyToManyField(Character)

    def __str__(self):
        return self.name

class Character(models.Model):
    name = models.CharField(max_length=10)
    movies = models.ManyToManyField(Movie)
    def __str__(self):
        return self.name

当我进行迁移终端状态时 “文件”/Users/osx/Desktop/Django Basics 2/Django 模型关系/mysite/core/models.py”,第 19 行,电影中 字符 = 模型.ManyToManyField(字符) NameError:名称“字符”未定义 (myvenv) (基础) OSX-MacBook-Pro:mysite osx$ "

我不知道错误来自哪里

【问题讨论】:

  • 请不要定义两个多对多关系。 Django 将自动构建一个反向关系,跨越同一个“通过”表。

标签: python django-models


【解决方案1】:

不要在两个模型中定义两个多对多关系。如果您在其中一个模型中定义多对多字段。 Django 将在另一个模型中自动构建“反向”关系。通过定义两个多对多模型,意味着如果你在一个多对多字段中给其中一个角色添加一部电影,那么该角色不会出现在你添加给该角色的电影中。

您收到错误的原因是因为您引用了一个在代码中尚未定义的类。您可以重新排序模型,或使用包含模型名称的字符串。例如:

class Movie(models.Model):
    name = models.CharField(max_length=10)
    # no characters field

    def __str__(self):
        return self.name

class Character(models.Model):
    name = models.CharField(max_length=10)
    movies = models.ManyToManyField(Movie, related_name='characters')
    def __str__(self):
        return self.name

通过指定related_name='characters',我们因此指定了Django应该如何反向命名关系。

【讨论】:

    猜你喜欢
    • 2022-10-16
    • 2018-07-14
    • 2017-12-25
    • 2021-07-17
    • 2012-05-13
    • 2017-08-17
    • 2021-04-14
    • 2020-08-17
    • 2021-03-09
    相关资源
    最近更新 更多