【问题标题】:Failure with syncdb --migrate on PostgreSQL database. Circular DependencyPostgreSQL 数据库上的 syncdb --migrate 失败。循环依赖
【发布时间】:2013-05-18 07:07:11
【问题描述】:

我正在尝试使用命令创建 Django 数据库的空副本

manage.py syncdb --migrate --database=<db_copy_name>

如果数据库是 sqlite3 数据库,它可以正常工作,但对于 postgres 数据库则失败。

使用 postgres,正常的 Django syncdb 创建表可以正常工作,但迁移部分失败。其中一个应用程序引用了另一个应用程序中的表,而另一个应用程序引用了第一个应用程序中的表,因此无论我迁移应用程序的顺序如何,我都会得到一个

django.db.utils.DatabaseError: relation "<table_name>" does not exist

我正在运行 Django 1.4、South 0.7.6、psycopg2 2.4.1、postgres 9.1 db。 South 0.8、0.8.1 和 Psychopg2 2.5 的问题是一样的。

【问题讨论】:

  • 运气好能解决这个问题吗?

标签: python django-models django-south syncdb django-postgresql


【解决方案1】:

尝试做一个惰性导入。将 import 语句从文件顶部移到需要它的模型类中

所以而不是

from other_app import foo

class Table(models.Model):

    foo = models.ForeignKey(foo)

这样做

class Table(models.Model):
    from other_app import foo

    foo = models.ForeignKey(foo)

【讨论】:

    【解决方案2】:

    如果您想拥有 ForeignField 或 ManyToManyField 等相关字段,请使用 '&lt;app_label&gt;.&lt;model_name&gt;' 字符串而不是导入模型来引用。例如,而不是:

    from myapp.models import MyModel
    
    class AnotherModel(Model):
        my_model = ForeignField(MyModel)
    

    写:

    class AnotherModel(Model):
        my_model = ForeignField('myapp.MyModel')
    

    这可以防止类主体中导入模型的依赖。如果你想在任何函数中使用其他模型,只需将其导入函数体而不是模块。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-12-24
      • 1970-01-01
      • 2012-02-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多