my.packages jest niestandardowym pakietem archetypes w katalogu src. Tysiące elementów w instancji Plone są dodawane wraz z jej typami. Chcę zmienić nazwę pakietu jako my.package. Po prostu odinstalowując pliki my.packages i instalując plik my.package, znajduję http://localhost:8080/mysite/myfolder/my-item, pokazując <persistent broken my.packages.content.mytype.MyType instance '\x00\x00\x00\x00\x00Un^'>
. Czy muszę przeprowadzić migrację? Czy istnieje prosty sposób na rozwiązanie tego problemu?Zmiana nazwy my.packages na my.package
Odpowiedz
Możesz utworzyć alias dla kompatybilności wstecznej, wykonując operację pod numerem sys.modules
. Czy to w pakiecie __init__.py
:
import sys
sys.modules['my.packages'] = sys.modules[__name__]
ten sposób maszyny wytrwałość może znaleźć zajęcia jeszcze.
Co się dzieje, gdy instancje Archetypes są przechowywane w ZODB, mechanizm trwałości przechowuje ścieżkę modułu dla klasy (kropkowana ścieżka Pythona, taka jak my.packages.types.foobar.FooBar
) w przechowywanych danych. Podczas przywracania obiektu z ZODB ta sama ścieżka jest używana do ponownego utworzenia instancji. Gdy zmienisz nazwę pakietu, wszystkie te odniesienia są zepsute.
W powyższej sztuczce fajnie jest, że jeśli obiekt został zmieniony i ponownie zapisany w ZODB w transakcji, zapisana zostanie ścieżka modułu nowa. Można w ten sposób napisać do wszystkich instancji Archetypes z tego pakietu, aby migracja stała się trwała, aby można było ponownie usunąć powyższe działania.