On 29.10.2012 14:34, Krzysztof Jurewicz wrote:
In February, Craig de Stigter released django-typed-models
<https://groups.google.com/d/topic/django-users/63z-ejUQ1Eg/discussion>,
a package implementing inheritance hierarchy for Proxy models with
automatic type recasting. I've written a fork of it with additional
possibility of adding fields to subclasses, therefore achieving a single
table inheritance implementation similar to Ruby on Rails' STI.

Refreshing this thread because it looks like my fork stopped working properly with recent Django master. I suspect that commit c2e1e by Anssi Kääriäinen should be blamed for this, especially the line

# Skip all proxy to the root proxied model
opts = opts.concrete_model._meta

in get_default_columns method. This causes it to generate potentially invalid set of columns for instantiated model because children typed models are implemented as proxy models and they have different set of fields than the root model, which stores all fields from its subclasses. In general having richer set of columns than required wouldn't be a problem, but those columns are used as positional arguments in model constructor and are therefore mapped incorrectly.

I know that proxy models are intended to have the same set of fields as the root model and that I was relying on a completely internal implementation detail, so it has no chance of being treated as a bug, but that being said, I wonder if maybe Django could be changed to make such modifications easier. Currently I see the following solutions to the encountered problem:

1. Do not touch Django code directly and adjust django-typed-models to the changes made. This would probably require writing custom Manager class for TypedModel with custom QuerySet class which will use custom Query class with custom SQLCompiler class which will finally have get_default_columns method copy-paste-changed. Not an elegant solution.

2. Take a completely different approach to achieve single table inheritance — ideas are welcome.

3. Modify Django code to be more friendly to django-typed-models. Current behavior of SQLCompiler looks a bit hackish to me, because in ideal world get_default_columns shouldn't care if a model is proxy or not — this should be handled by model class internally. So perhaps another layer of abstraction could be added to Django ORM to allow internal handling of such special cases as proxy models. This would ideally allow to specify STI as a completely different model type than proxy model.

4. Add single table inheritance as a new inheritance type in Django.

I'm not very familiar with Django ORM internals and additionally I don't know which of the above solutions have chances of getting approval by core devs, so feedback is welcome.

Regards,
Krzysztof

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

Reply via email to