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.

Raport sportowy #8


Zdjęcie: Luke Stackpoole, Unsplash

Isaac Asimov - "Ja, Robot"


Klasycznie o Trzech Prawach Robotyki

Nadchodzi nowe


Opis dokonanych zmian w aplikacji oraz zapowiedź przyszłych modyfikacji oraz ...

A Tribe Called Quest - Midnight Marauders


Recenzja jednego z najlepszych albumów rap/hip-hop. Poznaj hip-hop wysokich lotów.

Raport sportowy #1


Sportowe podsumowanie tygodnia

Arkusze i xlwt


Przykład użycia biblioteki xlwt (scalanie, zwijanie wierszy, zamrażanie wierszy i ...