Hi Robin,

On Thu, 2008-08-28 at 12:55 +0100, Robin Becker wrote:
> My boss, created a model that represents an override to parts of other model 
> instances;

Man, I gotta remember to use the "don't shoot me; my boss did it"
reasoning some time. :-)

>  the business logic demands that the model instances should be 
> uniquely defined by two attributes a and b
> 
> ie
> 
> o1.a==o2.a and o1.b==o2.b <==> o1 is o2.
> 
> I know that we can implement validation rules in the admin to ensure that 
> this 
> is so, but he prefers to merge an existing instance into the new version at 
> save 
> time and also delete the existing one. Is that in fact possible with django's 
> orm?
> 
> I'm thinking of code somewhat like this
> 
> def save(self):
>    P=list(Over.objects.exclude(id=self.id).
>       filter(a=self.a,b=self.b).order_by('id'))
>    if P:
>       for p in P:
>          self.merge(p)
>          p.delete()
>    super(Over, self).save()

You'll have to write the merge() method yourself, since that's going to
be domain specific (and also doesn't exist in Django). The rest of the
code looks fine, although there are a couple of micro-improvements
possible:

(1) The order_by() call is unnecessary for what you're doing.

(2) If you kept P as a queryset, instead of converting it to a list
(just drop the list() call in the first line), you could write:

        for p in P:
           self.merge(p)
        P.delete()
        
The delete call is then does as a single SQL statement. As with the
order_by() call, this probably isn't a big deal, since I'd expect P will
either be empty or contain only a very small number of elements. But
wanted to make you aware there is a delete() method on querysets that
does what you would expect.

(3) You can drop the "if P:" test, since everything will work smoothly
if P is empty (the results iterator of the queryset will return nothing
and delete() does nothing on an empty queryset).

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 [EMAIL PROTECTED]
For more options, visit this group at 
http://groups.google.com/group/django-users?hl=en
-~----------~----~----~----~------~----~------~--~---

Reply via email to