6

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

このような 2 つの子クラスがある理由は、別のモデルで 2 つのキーと値のペアをシミュレートしており、簡単に検索できるようにそれらを 2 つのテーブルに分割したかったからです。Generic 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

フラッシュを実行すると:

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

ID フィールドを子モデルの主キーとして手動で追加しようとしましたが、Django は親の ID フィールドと競合するというエラーをスローします。PostgreSQLが気に入るようにこれを修正するにはどうすればよいですか? そして、前もって感謝します。

4

2 に答える 2

3

django でモデルの継承を使用している場合は、class Parentabstract であると宣言する必要があります

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

ドキュメントを参照してください。一部の postgres / mysql の違いは、標準準拠のコードに対してのみテストされていると思います。これが、ここで問題が発生している理由である可能性があります。これらの変更を行った後もお勧め./manage.py syncdbします;-)

疑わしい場合、およびテスト環境で、テーブルを削除してからやり直すことができます

$ ./manage.py sqlclear | ./manage.py dbshell
于 2013-01-29T14:55:40.943 に答える
2

モデルには、ターゲット モデルへの外部キーが 1 つだけ含まれている必要があります。複数の外部キーがある場合、検証エラーが発生します。これは django の制限の 1 つです。

于 2013-01-29T15:01:36.427 に答える