首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >ImportError:无法从“hymnbook.models.author”(C:\..\hymnbook\models\author.py)中导入名称“Author”

ImportError:无法从“hymnbook.models.author”(C:\..\hymnbook\models\author.py)中导入名称“Author”
EN

Stack Overflow用户
提问于 2020-05-18 06:10:38
回答 2查看 273关注 0票数 0

我试图对我们一直在开发的这个应用程序进行迁移,但是当我运行python manage.py migrate时,我得到了以下错误:

从.author导入作者ImportError:无法从'hymnbook.models.author‘导入名称’hymnbook.models.author‘(C:\Users\Asus-PC\Py ImportError)

我正在使用python和django 3.0.6版本的3.7

ATT:所有型号都在同一个目录中,但在分隔文件中。

这是作者的模型

代码语言:javascript
复制
from django.db import models
from .hymn import Hymn


class Author(models.Model):
    first_name = models.CharField(max_length=20, null=False, blank=False, default='')
    last_name = models.CharField(max_length=20, null=False, blank=False, default='')
    country = models.CharField(max_length=50, blank=True, null=False)
    birth = models.DateTimeField()
    death = models.DateTimeField()
    hymn = models.ManyToManyField(Hymn, on_delete=models.CASCADE())

    def __str__(self):
        return self.first_name, self.hymn

这就是赞美诗的模型

代码语言:javascript
复制
from django.db import models
import uuid
from .verse import Verse
from .language import Language
from .hymnbook import HymnBook
from .author import Author
from .genre import Genre


class Hymn(models.Model):
    number = models.IntegerField()
    title = models.CharField(max_length=100, blank=False, null=False)
    genre = models.ForeignKey(Genre, on_delete=models.CASCADE)
    language = models.ForeignKey(Language, on_delete=models.CASCADE)
    hymnBook = models.ForeignKey(HymnBook, on_delete=models.CASCADE)
    author = models.ManyToManyField(Author)
    date = models.DateTimeField(blank=True, null=True)

    def __str__(self):
        return self.title

如果有人帮我这个忙,我会非常感激的!

从现在开始我的感谢!

EN

回答 2

Stack Overflow用户

发布于 2020-05-18 08:40:24

正如@Sthino_IV在注释中提到的,您有一个循环进口

  • author.py正在尝试从.hymn导入
  • hymn.py正在尝试从.author导入

您还在每个模型上向对方声明了一个ManyToManyField。这不是定义多到多关系的典型方式。阅读关于比萨和配料的文档中的示例。

要解决这个问题,您需要编辑authors.py:

  • 删除from .hymn import Hymn
  • 删除hymn = models.ManyToManyField(Hymn, on_delete=models.CASCADE())

我还建议您更新您的Hymn模型,将author属性重命名为authors并添加一个related_name

代码语言:javascript
复制
class Hymn(models.Model):
    # other fields go here
    authors = models.ManyToManyField(Author, related_name='hymns')

这将允许您访问Hymn实例上的所有作者,以及Author实例上的所有赞美诗。

您可能需要删除/migrations中的迁移文件并再次创建它。

票数 0
EN

Stack Overflow用户

发布于 2020-05-18 08:54:23

你为什么把所有的模型都保存在单独的文件里?这不是django标准,您可以直接在models.py文件中定义模型,并且可以在任何需要的地方导入

代码语言:javascript
复制
from .models import Author
#if model resides in same directory
代码语言:javascript
复制
from module.models import Author
#if model resides in another directory named "module"
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/61863399

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档