On Thu, 2009-03-05 at 22:02 -0800, hanks...@gmail.com wrote:
> Sorry for the unwieldy title, but nothing else strikes me at the
> moment.
> 
> I have a blog app -- a version of basic.blog, actually. There's a
> field in the model called "status" with two options: "draft" and
> "public."
> 
> What I want to do is trigger an action the first time (and /only/ the
> first time) a particular instance is saved as "public."
> 
> So:
> 
> Write a post in the admin, save as draft --> No action
> Edit the post some, save as draft again --> No action
> Edit more, publish                               --> Action triggered!
> Edit again                                           --> No action.
> 
> How would I go about this? My thought is to override save(), but I
> can't figure out how to inspect the instance at that point to
> determine if the status attribute has changed since it was created.

If the object has a primary key value, assuming you don't set that
manually yourself, then it already exists in the database. So fetch the
existing values.

        def save(*args, **kwargs):
           if self.pk:
              old_version = self.model.objects.get(pk=self.pk)
              # Work out the changes between "self" and "old_version"

(Before anybody starts complaining about the extra database hit, think
about how relatively infrequently new posts are saved in the scheme of
things. Even if it was at the rapid rate of once per minute, you
wouldn't notice the extra read.)

>  I
> assume that this information must be in there somewhere, since it
> seems like you'd need it to generate the SQL statement.

No. Django just checks to see if the record is already in the database.
We can't make any assumptions based on the primary key value for all
models, since people can assign to that attribute. However, if you know
that *your* code doesn't assign to that attribute, which is a pretty
normal case, you'll be able to use the pk test to know if you're saving
or updating.

One day (maybe 1.2 timeframe?!) we'll add at least optional change
detection to models and only update changed columns. There's a couple of
implementation things to be worked out there first, but it's on the
medium-term feature list.

Regards,
Malcolm



--~--~---------~--~----~------------~-------~--~----~
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