Opened 14 years ago
Closed 12 years ago
#15711 closed New feature (wontfix)
Abstract model managers should return subclass instances
Reported by: | Jeremy Dunck | Owned by: | nobody |
---|---|---|---|
Component: | Database layer (models, ORM) | Version: | 1.2 |
Severity: | Normal | Keywords: | pony |
Cc: | Triage Stage: | Design decision needed | |
Has patch: | no | Needs documentation: | no |
Needs tests: | no | Patch needs improvement: | no |
Easy pickings: | no | UI/UX: | no |
Description
Suppose a base:
class Document(Model): title = CharField() class Meta: abstract = True class Presentation(Document): num_kitten_pictures = IntegerField() class Spreadsheet(Document): num_pie_charts = IntegerField()
It would be useful if Documents.objects.filter(title='x') returned instances of both Presentation and Spreadsheet whose title was 'x'.
I'd expect support only for base-class fields. This should be safe, since inheritance should follow an is-a relationship.
Change History (9)
comment:1 by , 14 years ago
comment:2 by , 14 years ago
Type: | → New feature |
---|
comment:3 by , 14 years ago
Severity: | → Normal |
---|
comment:4 by , 14 years ago
Triage Stage: | Unreviewed → Design decision needed |
---|
Hm. This is starting to smell suspiciously like "narrow" support, which is a whole nest of works. Jeremy, would you expect to only support this for ABCs? Or would you want to see concrete base class support as well?
comment:5 by , 14 years ago
Well, I just meant for ABCs, but I see that this is a slippery slope. I think in general, concrete inheritance is to be avoided, but I understand it may be useful at times.
I suppose part of the problem is that a concrete base may be inherited by multiple subclasses so that there's no right answer in what instance to return. Diamond inheritance out of the ORM makes me queasy.
I just feel that from a reusable app perspective (and encouraging reusable apps to ship ABCs in general) it would help the app writer quite a bit to be able to rely on instance(ABC) coming out of the ORM. Is there some way we could draw a bright line around concrete to avoid narrow/widen?
comment:7 by , 14 years ago
Easy pickings: | unset |
---|
would there be a way to use two managers for the parent model?
i.e., parent.objects and parent.subclass_objects
comment:9 by , 12 years ago
Resolution: | → wontfix |
---|---|
Status: | new → closed |
On one hand, this is a cool feature, and on the other hand, it's a partial implementation of STI. It has been implemented externally, see django_polymorphic.
My gut feeling is that a partial implementation will be buggy in many edge cases. To include something like this in core, we must be confident that we can handle all cases correctly, and I don't think we have enough info yet.
Related discussion: http://groups.google.com/group/django-developers/browse_thread/thread/421d91a82ef474df