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. :

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: