2009-02-27 15 views
6

Co jakiś czas musisz zmienić nazwę modelu w Django (lub, w jednym z ostatnio napotkanych przypadków, podzielić jeden model na dwa, z nowymi/różnymi nazwami) . Tak, właściwe planowanie pomaga uniknąć tej sytuacji, ale czasami interweniuje rzeczywistość.Naprawianie tabeli auth_permission po zmianie nazwy modelu w Django

Po zmianie nazwy odpowiednich tabel w db i naprawieniu kodu, którego dotyczy problem, pozostaje jeden problem: wszelkie uprawnienia przyznane użytkownikom lub grupom do działania w tych modelach nadal odwołują się do starych nazw modeli. Czy istnieje jakiś zautomatyzowany lub półautomatyczny sposób, aby to naprawić, czy jest to tylko kwestia ręcznej operacji chirurgicznej? (w fazie rozwoju możesz upuścić tabelę auth_permissions i syncdb, aby ją odtworzyć, ale produkcja nie jest taka prosta).

Odpowiedz

0

Przebyłem mniej więcej w połowie długiej odpowiedzi, która zawierała szczegółowy plan ataku, który podjąłem w tej sytuacji, ale kiedy pisałem, zdałem sobie sprawę, że prawdopodobnie nie ma żadnego sposobu na obejście przestojów w tym zakresie. sytuacja.

Można zminimalizować czas przestoju dzięki przygotowanemu skryptowi loaddata, chociaż należy zachować ostrożność, aby upewnić się, że podstawowe klucze auth_perms są zsynchronizowane.

Zobacz także krótką odpowiedź: brak automatycznego sposobu wykonania tego, o czym jestem świadomy.

2

Oto a snippet, który wypełnia brakujące typy zawartości i uprawnienia. Zastanawiam się, czy mogłaby ona zostać rozszerzona na przynajmniej część pracy osła w celu oczyszczenia auth_permissions.

+0

Uwaga ta wersja skryptu nie działa z Django 1.0 - użyj http://www.djangosnippets.org/snippets/696/zamiast. – shacker

2

Jeśli zdarzyło się, że użył Południowa migrację schematu, aby zmienić nazwę tabeli dodaje się wiersz w migracji do przodu zrobiłby to automatycznie:

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

To działa cudownie! – gaqzi

1

Niedawno miałem ten problem i napisał funkcję do rozwiązania to. W przypadku zmiany nazwy modelu/tabeli zwykle występują rozbieżności w tabelach ContentType i Permission. Django ma wbudowane funkcje pomocnicze w celu rozwiązania problemu i można z nich korzystać w sposób następujący:

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

nie działa w moim przypadku (Django 1.7): obiekt 'module 'nie ma atrybutu' models_module'' – linqu

Powiązane problemy