1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 | from django.contrib.contenttypes.models import ContentType
class Contact(models.Model):
content_type = models.ForeignKey(ContentType,editable=False,null=True)
def save(self):
if(not self.content_type):
self.content_type = ContentType.objects.get_for_model(self.__class__)
self.save_base()
def as_leaf_class(self):
content_type = self.content_type
model = content_type.model_class()
if(model == Contact):
return self
return model.objects.get(id=self.id)
|
More like this
- IfValueTag by adurdin 6 years, 1 month ago
- DRY Fieldsets by DrMeers 3 years, 11 months ago
- Email Munger by cootetom 4 years, 4 months ago
- Model inheritance with content type and inheritance-aware manager by dan90 4 years, 8 months ago
- Form splitting/Fieldset templatetag by peritus 4 years, 8 months ago
Comments
awesome snippet, crucialfelix.
I've taken your snippet and tacked on a complementary QuerySet hack of my own to avoid having to manually call the
as_leaf_classmethod.#
One may achieve a similar goal without using ContentType. I suppose this boosts performance by omitting one DB hit if used with select_related():
This solution is, though, limited to only one inheritance level, but it could be extended by adding further get_concrete() to child classes.
#
This snippet is now included in django-snippetscream
#