Hi folks Ever since Django started supporting various types of model inheritance I've wondered why it lacks the kind that I would find most useful: python behaviour differentiated based on the value of a field.
I'll explain with an example. Here's what I'd like to do: class Datasource(models.Model): type = models.ModelTypeField() uri = models.CharField(max_length=256) # common behavior in the superclass def __repr__(self): return u'<%s: %s>' % (self.__class__.__name__, self.uri) class HttpDatasource(Datasource): # custom behaviour in the subclasses def get_filename(self): return self.uri.rsplit("/", 1)[-1] class ZipfileDatasource(Datasource): def get_filename(self): files = zipfile.list(self.uri) return files[0].rsplit('/', 1)[-1] >>> zip = ZipfileDatasource.objects.create(uri="/path/to/foo.zip") >>> uri = UriDatasource.objects.create(uri="http://example.com/foo.txt") >>> Datasource.objects.all() [<ZipfileDatasource: /path/to/foo.zip>, <UriDatasource: http://example.com/foo.txt>] >>>ZipfileDatasource.objects.all() [<ZipfileDatasource: /path/to/foo.zip>] >>> Datasource.objects.all().values_list('type', flat=True) [u'myapp.models.ZipfileDatasource', u'myapp.models.UriDatasource'] These are quite similar to proxy models, but vary in their queryset behaviour - the generic Datasource queryset has mixed types and the concrete querysets are always filtered by type. This is far more useful than proxy models, since the concrete types of each table are known. It's also better than making an abstract model and subclassing it, because now all the objects are in the same table and you can iterate over them all at once if you want. Adding more types is easy, since there are no schema changes (with abstract models you'd have to add a new table for each type). It's possible that proxy models could be extended to do this without breaking existing code. I'm not sure yet. I'm thinking of diving into this. Does anyone have any suggestions? Or, perhaps there's a reason why this hasn't been done previously that you more experienced gurus could illuminate? Thanks in advance Craig de Stigter Maintainer of django-mptt and full time dev at koordinates.com -- 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.