【问题标题】:Django ImportError: cannot import nameDjango ImportError:无法导入名称
【发布时间】:2018-05-29 22:22:01
【问题描述】:

我有一个应用程序 notes 和模型名称定义为

notes/models.py

from shorturls.models import ShortUrl

class Note(models.Model):
   # columns here

   def __str___(self):
       return self.title

@receiver(post_save, sender=Note)
def post_save_note_receiver(sender, instance, created, *args, **kwargs):
    if instance and created:
        ShortUrl.objects.create(note=instance)

和另一个应用程序shorturls 存储带有模型的每条记录的短 URL

shorturls/models.py

from notes.models import Note

class ShortUrl(models.Model):
    note = models.OneToOneField(Note, on_delete=models.CASCADE, blank=True)
    short_key = models.CharField()

    def __str__(self):
        return self.short_key

@receiver(pre_save, sender=ShortUrl)
def pre_save_short_url_receiver(sender, instance, *args, **kwargs):
    instance.short_key = unique_short_key_generator(instance)

但是在python manage.py makemigrations 上,它给出了错误

File "path_to_app/shorturls/models.py", line 7, in <module>
    from notes.models import Note
ImportError: cannot import name 'Note'

【问题讨论】:

  • 更新了问题并删除了该行。这是错误添加的。
  • 似乎存在循环导入,因为在Note 中我正在导入ShortUrl 以在post_save 上调用ShortNotecreate,因为我必须为ShortUrl 创建记录每次创建新注释时。在ShortUrl 中,我正在导入Note 以分配OneToOneField。如果这是循环导入的原因,在这种情况下如何解决

标签: django django-models django-2.0


【解决方案1】:

您的两个模型文件之间存在循环依赖关系。

您可以在一对一字段中用作字符串:

class ShortUrl(models.Model):
    note = models.OneToOneField('notes.Note', on_delete=models.CASCADE, blank=True)

然后您可以删除from notes.models import Note 以打破循环依赖。

【讨论】:

  • 谢谢。有效。因为我是 Django 新手,这是我自己做的项目。我想问一下我正在实施的这个逻辑是不是好方法?
  • 循环依赖通常表明您没有正确构建代码。在这种情况下,解决问题的最简单方法是在一对一字段中使用字符串。另一种选择是将post_save_note_receiver 移动到shorturls 应用程序中。这样,shorturls 应用程序将依赖于notes,但notes 将不依赖于shorturls
  • 如何在shorturls 中移动post_save_note_receiver,因为我必须在保存Note 时为shorturls 创建记录?
  • 我从notes/models.py 复制了post_save_receiver 代码,并将ShortUrlsender=Note 粘贴到sender=Note 中,然后从notes/models.py 中删除了它,还删除了导入行并且工作正常。感谢您的帮助
  • 使用该查询:instance.shorturl.short_key , note.shorturl.short_key
猜你喜欢
  • 1970-01-01
  • 2015-04-30
  • 2019-08-27
  • 2016-09-07
  • 2018-11-15
  • 1970-01-01
  • 1970-01-01
  • 2016-01-07
  • 1970-01-01
相关资源
最近更新 更多