1

だから私はdjango1.8.9を持ってdjango-filerいて、この問題に遭遇し始めました

insert or update on table "filer_clipboard" violates foreign key constraint "filer_clipboard_user_id_2b30c76f2cd235df_fk_auth_user_id"
DETAIL:  Key (user_id)=(67) is not present in table "auth_user".

私が追加した新しいカスタムユーザーと関係があることに気付きましたが、ファイラーのソースコードを見ると、それも対処する必要があります

class Clipboard(models.Model):
    user = models.ForeignKey(getattr(settings, 'AUTH_USER_MODEL', 'auth.User'), verbose_name=_('user'), related_name="filer_clipboards")

まだAUTH_USER_MODEL = 'authtools.User'意味がわからなかったので、データベースを調べたところ、古い制約がまだ残っていることがわかりました(新しいユーザーに更新されませんでした)

postgres=# \d filer_clipboard
                          Table "public.filer_clipboard"
 Column  |  Type   |                          Modifiers                           
---------+---------+--------------------------------------------------------------
 id      | integer | not null default nextval('filer_clipboard_id_seq'::regclass)
 user_id | integer | not null
Indexes:
    "filer_clipboard_pkey" PRIMARY KEY, btree (id)
    "filer_clipboard_e8701ad4" btree (user_id)
Foreign-key constraints:
    "filer_clipboard_user_id_2b30c76f2cd235df_fk_auth_user_id" FOREIGN KEY (user_id) REFERENCES auth_user(id) DEFERRABLE INITIALLY DEFERRED
Referenced by:
    TABLE "filer_clipboarditem" CONSTRAINT "filer_clipb_clipboard_id_335d159e1aea2cdc_fk_filer_clipboard_id" FOREIGN KEY (clipboard_id) REFERENCES filer_clipboard(id) DEFERRABLE INITIALLY DEFERRED

これを修正する方法についてのアイデアはありますか? SQL に頼って制約を削除し、新しい制約を追加することは、最善の方法とは思えません。

4

1 に答える 1

0

ファイラーコードベースのすべてのユーザー外部キーに設定db_constraint=Falseし、移行を適用してから再度削除するか、または設定しますdb_constraint=True(影響があるためhttps://docs.djangoproject.com/en/1.8/ref/models/fields/#django .db.models.ForeignKey.db_constraint ) は、必要な新しい制約を自動的に作成します。

これは、django が自動的に実行するため、SQL を手動で記述するよりもはるかに優れています。

まだテスト中ですが、これまでのところエラーは発生していません

アップデート:

django_admin_log エントリがまだ間違ったユーザーを指していたため、RUNSQL を使用してデータ移行を書き込むように追加します。

operations = [
    migrations.RunSQL("BEGIN;"),
    migrations.RunSQL(
        "ALTER TABLE django_admin_log DROP CONSTRAINT "
        "django_admin_log_user_id_52fdd58701c5f563_fk_auth_user_id"
    ),
    migrations.RunSQL(
        "ALTER TABLE django_admin_log ADD CONSTRAINT "
        "django_admin_log_user_id_52fdd58701c5f563_fk_authtools_user_id "
        "foreign key (user_id) references authtools_user(id) "
        "DEFERRABLE INITIALLY DEFERRED"
    ),
    migrations.RunSQL("COMMIT;"),
]

これを影響を受けるデータベースに適用して修正した後、このコードを削除して、存在しない例外をスローすることなく新しいデータベースで実行できるようにします。

于 2016-02-26T19:26:03.730 に答える