【问题标题】:Importing legacy database into django将遗留数据库导入 django
【发布时间】:2013-08-07 01:35:24
【问题描述】:

因此,当您使用 django 的 inspectdb 功能导入旧数据库时,它指出您需要手动清理“重新排列模型的顺序”。在 django 网站上的文档中,它声明“特别是,您需要重新排列模型的顺序,以便正确排序引用其他模型的模型。”。

这到底是什么意思?如果模型 A 引用模型 B,那么模型 B 在文件中应该出现在模型 A 之前?

【问题讨论】:

  • 您能否提供指向您所指向的文档的链接?

标签: django django-models


【解决方案1】:

在 django 网站上的文档中,它声明“特别是, 您需要重新排列模型的顺序,以便引用的模型 其他型号已正确订购。”

这到底是什么意思?

一般在Python中,要引用任何名字,都需要先定义;因为只有这样它才会被映射;所以这会导致错误:

print(hello)
hello = 'world'

类似地,在models.py 中,当您在任何关系中引用另一个模型类时;您必须确保在引用该类之前声明该类 - 或者您需要引用类名。由于检查无法保证创建模型的顺序,因此您会收到警告。它旨在防止这种情况,这将导致错误:

class A(models.Model):
   foo = models.ForeignKey(B)

class B(models.Model):
   name = models.CharField(max_length=200)

要修复它,您可以在A 之前声明B

class B(models.Model):
    name = models.CharField(max_length=200)

class A(models.Model):
    foo = models.ForeignKey(B)

或者使用字符串代替名称:

class A(models.Model):
   foo = models.ForeignKey('B')

class B(models.Model):
   name = models.CharField(max_length=200)

【讨论】:

  • 在你的最后一个例子中,如果你使用字符串而不是名称,它仍然正确引用它吗?
  • 是的。此功能在文档中,但隐藏在 field reference section 中。
猜你喜欢
  • 2011-01-17
  • 2016-02-15
  • 2021-05-16
  • 2021-08-26
  • 1970-01-01
  • 2017-03-19
  • 1970-01-01
  • 1970-01-01
  • 2013-12-15
相关资源
最近更新 更多