微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

使用PostgreSQL的Django模型继承错误

我正在从 MySQL后端切换到Postgresql后端,并且遇到了一些模型继承问题.以下是模型的示例:

class Parent(models.Model):
   key = models.Charfield(...)
   value = models.Charfield(...)
   content_type = models.ForeignKey(ContentType)
   object_id = models.CharField(max_length=200)
   content_object = generic.GenericForeignKey('content_type','object_id')

class Child1(Parent):
   pass 

class Child2(Parent):
   pass

我们有这样两个子类的原因是,我们在另一个模型中模拟两个键/值对,并希望将它们分成两个表以便于查找.通用FK也用于将其附加到其他模型.这种继承设置在MysqL中运行良好,但是当我将其切换到Postgresql时,我在尝试运行测试时遇到错误(但syncdb工作正常).这就好像Django关系良好,但Postgresql不喜欢生成sql.当我查看syncdb生成内容时,我看到了:

CREATE TABLE "myapp_parent" (
"id" serial NOT NULL PRIMARY KEY,"key" varchar(200) NOT NULL,"value" varchar(200) NOT NULL,"content_type_id" integer NOT NULL REFERENCES "django_content_type" ("id") DEFERRABLE  INITIALLY DEFERRED,"object_id" varchar(200) NOT NULL);

CREATE TABLE "myapp_child1" (
"parent_ptr_id" integer NOT NULL PRIMARY KEY REFERENCES "myapp_parent" ("id") DEFERRABLE INITIALLY DEFERRED);

CREATE TABLE "myapp_child2" (
"parent_ptr_id" integer NOT NULL PRIMARY KEY REFERENCES "myapp_parent" ("id")    DEFERRABLE INITIALLY DEFERRED);

所以一切看起来都正确,然后当我运行我的测试时,我得到了这个:

Error: Database test_myapp Couldn't be flushed. Possible reasons:
* The database isn't running or isn't configured correctly.
* At least one of the expected database tables doesn't exist.
* The sql was invalid.
Hint: Look at the output of 'django-admin.py sqlflush'. That's the sql this command    wasn't able to run.
The full error: column "id" of relation "myapp_child1" does not exist

当我运行flush时:

SELECT setval(pg_get_serial_sequence('"myapp_child1"','id'),1,false);

我已经尝试手动添加ID字段作为子模型中的主键,但Django会抛出一个错误,说它与Parent的ID字段冲突.我如何解决这个问题,以便Postgresql喜欢它?并提前感谢.

解决方法

如果你在django中使用模型继承,你应该声明类Parent是抽象的

class Parent(models.Model):
    ...
    class Meta:
        abstract = True

请参阅docs.我认为一些postgres / MysqL差异仅针对标准符合代码进行了测试 – 这可能就是您在这里遇到问题的原因.进行这些更改后我还建议使用./manage.py syncdb

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。

相关推荐