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.

ACL


Rozszerzone uprawnienia w systemie plików.

Coś innego, coś lepszego?


Python to język programowania coraz częściej wybierany przez programistów aplikacji ...

Justice - Cross


Pierwsza płyta francuskiego zespołu Justice już w dniu premiery stała ...

Django-filter i "Generic View"


Przykład użycia Django-filter w widokach generycznych opartych na klasach

ReportLab PDF


Opis biblioteki służącej do tworzenia plików PDF. Przykłady tworzenia tabeli ...

Warning: this LDM has ...


Co zrobić gdy GRUB nie może zapisać tablicy partycji do ...

© Grzegorz Tatara
Przeglądając stronę grzegorztatara.pl zgadzasz się na użycie plików cookies
Ikona avatara pobrana z internetu (na licencji do użytku komercyjnego).