使用PostgreSQL的Django模型继承错误
发布时间:2020-12-13 15:55:58 所属栏目:百科 来源:网络整理
导读:我正在从 MySQL后端切换到PostgreSQL后端,并且遇到了一些模型继承问题.以下是模型的示例: class Parent(models.Model): key = models.Charfield(...) value = models.Charfield(...) content_type = models.ForeignKey(ContentType) object_id = models.Cha
我正在从
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 (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |