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.

25máj.

Szólj hozzá