Django - historia wersji modelu
26 lutego, 2009
Przy obecnym (a zarazem pierwszym pisanym w django) projekcie dla klienta otrzymałem wytyczne, że wszelkie zmiany w określonych modelach powinny być archiwizowane w historii, aby później łatwo można było ustalić kto popełnił ewentualny błąd. Parę dni spędziłem na przeszukiwaniu niezbadanych czeluści internetu aby znaleźć odpowiednie rozwiązanie - bo po co pisać coś, co już prawdopodobnie zostało napisane?
Do wyboru znalazłem m.in. :
- Django History - brak chyba jakiejkolwiek dokumentacji
- Django FullHistory - ostatnia aktualizacja z listopada 2008 kieruje do innego projektu (poniżej), który miał być bardziej kompletny:
- Django Model History - ten z kolei umarł w grudniu 2008.
Aż wkońcu prawie przypadkiem trafiłem na projekt Django Reversion , który okazał się strzałem w dziesiątkę.
Krótki, acz wystarczający podręcznik z instrukcją instalacji znajduje się w GettingStarted. Po zainstalowaniu pakietu w systemie należy oczywiście dodać wpis 'reversion' do listy INSTALLED_APPS.
Historia w Panelu Administracyjnym
Aby korzystać z historii modeli tylko w panelu administracyjnym, wystarczy zmienić dziedziczenie wybranego modelu ze standardowego django.contrib.admin.ModelAdmin na reversion.admin.VersionAdmin, czyli w pliku admin.py wpiszemy:
from django.contrib import admin from reversion.admin import VersionAdmin from projekt.models import MojModel #nasze nowe dziedziczenie class MojModelAdmin(VersionAdmin): #reszta standardowych ustawien admina list_display = (...) # zarejestrowanie modelu admin.site.register(YourModel, YourModelAdmin)
I tyle! Zmiany dokonywane w obiektach tego modelu zostaną automatycznie zarchiwizowane, a przywrócenie poprzedniej wersji będzie możliwe po naciśnięciu przycisku Historia widocznego podczas edycji obiektu.
Historia w całym projekcie
Aby archiwizację modelu wprowadzić do zwyczajnych widoków poza panelem administracyjnym, potrzebujemy zarejestrować wybrany model w module reversion :
from projekt.models import MojModel import reversion reversion.register(MojModel)
Najwygodniej zrobić to w pliku models.py, aby rejestracja przebiegła od razu po starcie aplikacji.
Teraz mamy do wyboru kilka sposobów tworzenia historii modelu, wszystkie opisano w dokumentacji , ja wybrałem ten, który najbardziej mi pasuje - wybrane widoki opakowuję dekoratorem revision.create_on_success i po zapisaniu obiektu dodaję opis rewizji :
from reversion import revision from projekt.models import MojModel @revision.create_on_success def moja_funkcja(request): m = MojModel() m.save() revision.user = request.user revision.comment = "Utworzono nowy model: %s" % m
W dokumentacji znajdziemy jeszcze parę przykładów implementacji pluginu oraz szczegółowe informacje o dostępnym funkcjach API.
Tym sposobem w ciągu kilku minut otrzymujemy aplikację z archiwizacją modeli oraz możliwością prostego przywracania ich poprzednich wersji.
Komentarze do wpisu "Django - historia wersji modelu":
1.
occulkot napisał(a):
26 lutego 2009, 15:23:50
sprawdzales jak jest z wersjonowaniem modeli z m2m i ogolnie relacjami?
2.
chester napisał(a):
26 lutego 2009, 15:25:03
w dokumentacji jest szerzej opisane – można dodać które pola mają byś obserwowane, nawet m2m; można też ustalić które pola modelu mają zostać zapisane, a które pominąć.
3.
occulkot napisał(a):
26 lutego 2009, 15:26:44
goood – zobacze co i zacz i moze wywale wlasne stare rozwiazanie na korzysc tego :D.
4.
chester napisał(a):
26 lutego 2009, 15:28:51
polecam na dzień dzisiejszy :)
trochę mi się nie podoba tam serializacja, bo obecnie historia jest przechowywana w formie w xml lub opcjonalnie yml i troszkę to miejsca zajmuje, ale narazie nie jestem w stanie napisać własnej, choć podobno można :)
Dodaj komentarz: