2009-02-27 7 views
6

これまではDjangoでモデルの名前を変更する必要がありました(あるいは最近発生した1つのモデルを2つに分割し、 。はい、適切な計画はこのような状況を回避するのに役立ちますが、時にはリアリティが介入することもあります。Djangoでモデルの名前を変更した後にauth_permissionテーブルを修正する

db内の対応するテーブルの名前を変更し、影響を受けるコードを修正した後、1つの問題が残ります。これらのモデルで操作するユーザーまたはグループに付与されたアクセス許可は、引き続き古いモデル名を参照します。これを修正するための自動化または半自動化された方法がありますか、それとも手動db手術の問題ですか? (開発中にauth_permissionsテーブルとsyncdbを削除して再作成することはできますが、生産はあまり簡単ではありません)。

答えて

0

私は、この状況で取るだろう攻撃の計画を詳述する長い答えを得ましたが、私が書いていたように、この中でメンテナンスのダウンタイムを行う必要はないでしょう状況。

auth_permsの主キーが同期していることを確認するためには注意が必要ですが、準備したloaddataスクリプトを使用することで、ダウンタイムを最小限に抑えることができます。

また、短い回答を参照してください:私が知っているこれを行う自動化された方法はありません。

2

ここには、不足しているコンテンツタイプとアクセス許可を埋め込むa snippetがあります。 auth_permissionsのクリーンアップのためのロバの作業の少なくとも一部を行うために、それを拡張できるかどうかは疑問です。あなたは、テーブルの名前を変更するために、南スキーマの移行を使用していたために起こった場合は

+0

注 - http://www.djangosnippets.org/snippetsを使用します/ 696 /代わりに。 – shacker

2

、前方移行に次の行は、この自動的に行っているでしょう:

db.send_create_signal('appname', ['modelname']) 
+0

これは素晴らしく機能します! – gaqzi

1

私は最近、この問題を持っていたし、解決するための機能を書きましたそれ。モデル/テーブルの名前を変更すると、通常、ContentTypeテーブルとPermissionテーブルの両方に矛盾が生じます。 Djangoはこの問題を解決するためのヘルパー関数を内蔵しており、あなたは次のようにそれらを使用することができます。スクリプトのこのバージョンでは、Djangoの1.0では動作しません

from django.contrib.auth.management import create_permissions 
from django.contrib.contenttypes.management import update_all_contenttypes 
from django.db.models import get_apps 

def update_all_content_types_and_permissions(): 
    for app in get_apps(): 
     create_permissions(app, None, 2) 
    update_all_contenttypes() 
+0

私の場合(Django 1.7)では動作しません: '' module 'オブジェクトには' models_module '属性がありません – linqu

関連する問題