Now I have revise the code as follow: The as_leaf_class(): def as_leaf_class(self): content_type = self.content_type model = content_type.model_class() if (model == Product): return self try: obj = model.objects.get(id=self.id) return obj except: return None #return model.objects.get(id=self.id) The __iter__() and __getitem__(): def __getitem__(self, k): result = super(SubclassingQuerySet, self).__getitem__(k) if isinstance(result, models.Model): alc = result.as_leaf_class() if alc: return alc #return result.as_leaf_class() else: return result
def __iter__(self): for item in super(SubclassingQuerySet, self).__iter__(): alc = item.as_leaf_class() if alc: yield item.as_leaf_class() Is this solution correct? On Apr 4, 8:19 pm, TTear1943 <1943....@gmail.com> wrote: > I use a snippet inhttp://www.djangosnippets.org/snippets/1034/for my > Model inheritance. It works fine at the first.However, after I delete > some elements in database, the code works wrong. > As I debug, I found that the problem resides in the method: > as_leaf_class. > In the following code: > def as_leaf_class(self): > content_type = self.content_type > model = content_type.model_class() > (1*) if(model == Contact): > return self > (2*) return model.objects.get(id=self.id) > when query a deleted object, line (1*) will be False, So it tries to > run line (2*) which raise an exception from get() > Anyone could give a solution for this? > > The snippets I use is following: > Model inheritance with content type and inheritance-aware manager > from django.db import models > from django.contrib.contenttypes.models import ContentType > from django.db.models.query import QuerySet > > class SubclassingQuerySet(QuerySet): > def __getitem__(self, k): > result = super(SubclassingQuerySet, self).__getitem__(k) > if isinstance(result, models.Model) : > return result.as_leaf_class() > else : > return result > def __iter__(self): > for item in super(SubclassingQuerySet, self).__iter__(): > yield item.as_leaf_class() > > class MealManager(models.Manager): > def get_query_set(self): > return SubclassingQuerySet(self.model) > > class Meal (models.Model) : > name = models.TextField(max_length=100) > content_type = models.ForeignKey > (ContentType,editable=False,null=True) > objects = MealManager() > > def save(self, *args, **kwargs): > if(not self.content_type): > self.content_type = ContentType.objects.get_for_model > (self.__class__) > super(Meal, self).save(*args, **kwargs) > > def as_leaf_class(self): > content_type = self.content_type > model = content_type.model_class() > if (model == Meal): > return self > return model.objects.get(id=self.id) > > class Salad (Meal) : > too_leafy = models.BooleanField(default=False) > objects = MealManager() --~--~---------~--~----~------------~-------~--~----~ 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 django-users+unsubscr...@googlegroups.com For more options, visit this group at http://groups.google.com/group/django-users?hl=en -~----------~----~----~----~------~----~------~--~---