我正在从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喜欢它?并提前感谢。
答案 0 :(得分:2)
如果你在django中使用模型继承,你应该声明class Parent
是抽象的
class Parent(models.Model):
...
class Meta:
abstract = True
请参阅docs。我想有些postgres / mysql差异只是针对标准符合代码进行了测试 - 这可能就是你在这里遇到问题的原因。进行这些更改后,我还建议./manage.py syncdb
; - )
如果有疑问,在测试环境中,您可以放弃表格并重新开始
$ ./manage.py sqlclear | ./manage.py dbshell
答案 1 :(得分:2)
您的模型必须包含目标模型的一个且只有一个外键。如果您有多个外键,则会引发验证错误。这是django的限制之一。