On Oct 27, 4:54 pm, Todd Blanchard <tblanch...@mac.com> wrote:
> Total django noob here.  Rails/PHP/WebObjects refugee here.
>
> I'm starting a project where some models need to be fully versioned.
>
> IOW, record update is forbidden - every save to a changed model should  
> result in a new record with a new version number or timestamp along  
> with identity pulled from the current authenticated user's session.  
> Queries/relationships should be specified as "fetch newest" or "fetch  
> history".  IOW sometimes I want to traverse a relationship and just  
> get the "current" record.  Sometimes I want to get the history of that  
> relationship.
>
> Anybody done this?  Got any tips?
>
> Thanks,
> -Todd Blanchard

You can do all that without much magic.


class MyVersionedModel(models.Model):
    user = models.ForeignKey('User', editable=False)
    timestamp = models.DateTimeField(auto_now_add=True,
editable=False)

    class Meta:
        ordering = ['-timestamp']
        get_latest_by = 'timestamp'
        abstract = True

    def save(self, *args, **kwargs):
        self.pk = None # Forces insert
        return super(MyVersionedObject, self).save(*args, **kwargs)


Now you just need to inherit this mixin on all models you want
versioned.


class MyVersionedPony(MyVersionedObject):
    ... # Whatever other fields


In your views you can:


def my_pony_view(request):
    ...
    my_pony.user = request.user
    my_pony.save() # Always inserts instead of updating

    current_pony = MyVersionedPony.objects.latest()  # Last pony
    all_ponies = MyVersionedPony.objects.all() # Ordered descending


If you need to encapsulate logic for more complex queries, you can
create a model manager. [1]

http://docs.djangoproject.com/en/dev/topics/db/managers/
--~--~---------~--~----~------------~-------~--~----~
You received this message because you are subscribed to the Google Groups 
"Django users" group.
To post to this group, send email to django-users@googlegroups.com
To unsubscribe from this group, send email to 
django-users+unsubscr...@googlegroups.com
For more options, visit this group at 
http://groups.google.com/group/django-users?hl=en
-~----------~----~----~----~------~----~------~--~---

Reply via email to