Ich verwende ein Snippet in http://www.djangosnippets.org/snippets/1034/ für meine Modellvererbung. Es funktioniert auf Anhieb. Nachdem ich jedoch einige Elemente in der Datenbank gelöscht habe, funktioniert der Code falsch. Beim Debuggen stellte ich fest, dass das Problem in der Methode resident ist: as_leaf_class. Im folgenden Code:Problem bei der Modellvererbung, wenn einige Elemente gelöscht werden
if (model == Meal):
return self
return model.objects.get(id=self.id)
die letzte Zeile wird Ausnahme auslösen, wenn das Element gelöscht. Jeder könnte eine Lösung dafür geben?
Modell Vererbung mit Inhaltstyp und Vererbung-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()
Bitte sagen Sie uns, welche Ausnahme ausgelöst wird. ObjecNotExist? Ein Stack-Trace könnte helfen. –