South i "Cannot freeze..."


22 lipca 2013


Wpis prezentuje rozwiązanie problemu związanego z South gdy typ pola w modelu nie jest standardowym dostarczanym przez Django.

Tworząc modele w Django możemy użyć polecenia "syncdb" aby na ich podstawie stworzyć tabele w bazie danych. Polecenie to pozwala na wykonanie także innych czynności.  W przypadku gdy np. dodamy nowe pole do modelu będziemy zmuszeni dodać ręcznie nowe pole do bazy danych, ponieważ Django nie posiada funkcjonalności, która zapewniłaby aktualizację bazy danych w wyniku zmian dokonanych w modelach. Ręczne wprowadzanie zmian w strukturze tabel oraz na danych w bazie danych jest złym rozwiązaniem i powinno być przeprowadzane w ostateczności. Jeżeli nie chcemy przeprowadzać zmian w bazie danych pisząc samemu zapytania i wykonując je po stronie serwera bazy danych możemy skorzystać z South, który zautomatyzuje wiele czynności.

South jest "prostym, stabilnym i niezależnym od warstwy bazy danych" narzędziem, które umożliwia przeprowadzanie migracji zmian wprowadzonych w schemacie bazy danych. Dodając przykładowo nowe pole do modelu możemy wykonać migrację, po której struktura tabeli zostanie zmodyfikowana i etap "ręcznej modyfikacji" zostanie całkowicie wyeliminowany. South potrafi migrować także dane, tworzyć punkty na podstawie, których możemy przeprowadzać proces migracji lub też do których możemy cofać migrację (migracje wsteczne).  

Korzystając z South spotkałem się z następującym problemem. W jednym z modeli wykorzystywałem moduł "django-thumbs", który umożliwia generowanie miniaturek dla fotografii. Podczas próby przeprowadzania migracji otrzymałem wyjątek podobny to następującego:

! Cannot freeze field 'accounts.userprofile.foto' 
! (this field has class plugins.thumbs.ImageWithThumbsField) 

! South cannot introspect some fields; this is probably because they are custom 
! fields. If they worked in 0.6 or below, this is because we have removed the 
! models parser (it often broke things). 
! To fix this, read http://south.aeracode.org/wiki/MyFieldsDontWork 

South nie potrafił utworzyć szablonu migracji dla pola, którego typ nie był standardowym używanym w modelach Django. South rzuca wyjątkiem gdy nie potrafi wywołać konstruktora klasy odpowiedzialnej za pole modelu.  Problem nie powstanie gdy używamy standardowych typów pól modeli Django oraz najpopularniejszych aplikacji Django, ponieważ South ma zaimplementowaną ich obsługę.
Problem możemy rozwiązać m.in. dodając w pliku definiującym model następujący kod:

from south.modelsinspector import add_ignored_fields
add_ignored_fields(["^plugins\.thumbs\.ImageWithThumbsField"])

W funkcji "add_ignored_fields" podajemy ścieżkę do pliku zawierającego  definicję klasy "ImageWithThumbsField".

South to bardzo przydatne narzędzie polecane przez wielu programistów, które rozwiązuje dużą liczbę problemów i przyczynia się szybszego wytwarzania aplikacji. W kolejnym wpisie na blogu opiszę dokładniej jak używać South

Co zawiera blog?

Na blogu umieszczam wpisy dotyczące mojej pracy, zainteresowań. Głowna tematyka to programowanie oraz recenzje płyt oraz książek.

PostGIS i przestrzenna baza danych


Na system GIS składa się kilka elementów wśród, których można ...

Django. Tworzenie aplikacji sieciowych


Kilka słów o książce napisanej przez Antonio Melé. Czy warto ...

Żywy i martwy kot


Na początku miesiąca swoją premierę miała najnowsza wersja systemu operacyjnego ...

Underworld - dubnobasswithmyheadman


Underworld to historia muzyki techno, house i trance

ACL


Rozszerzone uprawnienia w systemie plików.

The Prodigy - The Fat Of The Land


20 lat jak jeden dzień