On Fri, 2008-09-12 at 11:57 -0700, dadapapa wrote:
> > It does not work at all. For some reason, final_type also gets
> > upcasted to MediaObject?!
> I found the solution, now. The problem was that the __init__ method of
> a Model is also called when objects are restored from the database. So
> when the base class gets initialized by the QueryManager, it
> overwrites final_type with the wrong value. The solution is simple:
> overwrite the save method instead of __init__. Here is a complete
> recipe:
>     class BaseClass(models.Model) :
>         final_type = models.ForeignKey(ContentType)
>         def save(self,*args) :

For absolute robustness, you should also accept **kwargs here. There are
a couple of places in Django's code that will call save() and pass in
force_insert=True, for example, which won't be handled by *args. In
reality, all you need to be able to handle is force_insert and
force_update, but *args and **kwargs are also pretty useful,
particularly if you aren't doing anything with them except passing them

>             self.final_type =
> ContentType.objects.get_for_model(type(self))
>             super(BaseClass,self)save(*args)
>         def cast(self) :
>             return
> self.final_type.get_object_for_this_type(id=self.id)
>     class DerivedClass(ParentClass) :
>         pass
> Here is an example:
>     obj = DerivedClass()
>     obj.save()
>     obj = get_object_or_404(BaseClass, id=3).cast()
>     # obj is now of type DerivedClass

Yes, well done. This looks like the right way to handle this. Glad
somebody's documented it here.


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 

Reply via email to