Változáskövetett modellek Djangoban
A django-reversion-ről írok. pip install django-reversion. Iskolapéldája a Djangohoz tapasztható az újrafelhasználható komponenseknek. Használatával a megjelölt modellek változásait rögzíthetjük, és állíthatjuk vissza tetszőleges korábbi állapotba.
blogpost = BlogPost.objects.get(slug='django-reversion')
version_list = Version.objects.get_for_object(blogpost).order_by('-pk') # összes objektumon végzett változás listája
version = version_list[0] # legutóbbi változat
version.revision.revert() # a revizióban lévő valamennyi verzió egyidejű visszaállítása
Az alkalmazás terminusával élve több modell változásait felölelő reviziókat (revision.models.Revision) hozhatunk létre, amelyek a bennfoglalt entitások változásait leíró verziókból állnak (revision.model.Version). Egy revizió hatókörét mi határozhatjuk meg: a middleware telepítésével minden nézetet becsomagolhatunk, így valamennyi benne történt modell módosítás mentésre kerül. Dekorátorokkal nézet szinten adhatók meg ezek, de támogatott egy újhullámos context manager alapú felhasználási mód is.
@method_decorator(revision.create_on_success)
def form_valid(self, form):
revision.user = self.request.user
revision.comment = _(u'A blogbejegyzés mentésre került')
return super(BlogPostUpdateView, self).form_valid(form)
Változáskövetés modellekhez többféle módon kivitelezhető. A reversion azt az útat járja, amikor a forrás modell adatbázis táblájától független relációban rögzíti a korábbi állapotokat. Fenntart egy verzió modellt, amely generikus kulcsokon keresztül kapcsolható tetszőleges modellhez, a megfigyelt modell állapotát szerializáltan (alapértelmezetten JSON-ként) tárolja.
A revisionbe explicit regisztrálnunk kell a megfigyelni kívánt modelleket. A külső kulcsok mentén a kapcsolt modellek állapota is menthető. Ha ez utóbbit szeretnénk (több modellre osztott egy logikai entitás esetén), ne feledjük el az esetleges fordított irányú kapcsolatok neveit is felsorolni (amikor tehát a külső modellen definiált a forrás modellel való kapcsolat). Sikerült egy órát elmolyolnom ezzel, mire rájöttem.
reversion.register(BlogPost, follow=['author', 'tags'])
Az alkalmazás egyébiránt a modelleken definiált gyári post_save jelet fogja.
Posted
by