6

Django アプリで非常に不可解なエラーに対処しようとしています。DEBUG=False の場合、( 経由で) ユーザーを削除しようとすると、次のuser.delete()データベース エラーが発生します。

DatabaseError: relation "social_auth_usersocialauth" does not exist
LINE 1: ...", "social_auth_usersocialauth"."extra_data" FROM "social_au...

ただし、INSTALLED_APPS に social_auth などの類似の名前はありません。また、データベースにそのようなテーブルもありません。コードのいずれも、そのようなものを参照していません (全体で「social」でテキスト検索を実行しました)。プロジェクト フォルダ) - DEBUG=True の場合、これは正常に機能します。social_auth は私のシステムと PYTHONPATH にインストールされていますが、このアプリがデータベースに social_auth のテーブルを持つべきだと考えている場所がわかりません。

アプリがこのテーブルを取得する可能性のある経路は何ですか?また、そこにあるはずがないことをどのように納得させることができますか?

4

2 に答える 2

1

この問題は、 Django コンテンツ タイプによって実現される保存された一般的な関係が原因である可能性があります。Django のリレーションは、モデルによって実装される静的なだけでなく、数値 ID から app_label + モデルへのマッピングを保存するテーブルによって動的に実装されます。可能性のある動的な関係の例は、許可またはコメントです。インストールされているアプリケーションのテーブルへのアクセス許可を持っていても、持っていなくてもかまいません。モデルを変更せずに、記事、ユーザー、コメントなど、あらゆるものにコメントを書き込むことができます。この関係は、そのモデル(テーブル)に関連する ContentType の数値 id と、関連するオブジェクト(行)の主キーを保存することで実現されます。INSTALLED_APPSdjango_content_type

Django は、誰かがデータベースを手動で操作できることを想定していません。操作にsouthを使用し、アプリケーションをアンインストールした後に を実行するsyncdbと、south から孤立したコンテンツ タイプを自動的に削除するかどうか尋ねられます。その後、未使用のテーブルを後で参照することなく安全に削除できます。

(ハックの可能性:delete from django_content_type where app_label='social_auth'しかしsouth間違いはありません。)

質問の多くの部分はまだ未解決です。

編集
なぜそれが正しい方法ではなかったのか:すべての一般的な関係は子孫から親へのものであり、関係に関するすべてのデータは子孫に保存されます。子アプリが INSTALLED_APPS から削除された場合、django.db コードは子孫を削除しようとすることができなくなります。これは、どの列に関係データが含まれているかを認識できないためです。

于 2012-11-14T22:34:39.500 に答える
-1

このテーブルは、django-social-authアプリケーションによって作成されます。

プロジェクトに追加したものの、まだ起動していないようですmigrate(またはsyncdb)。

于 2012-11-13T19:25:36.863 に答える