【发布时间】:2010-10-17 13:08:39
【问题描述】:
我在http://www.djangosnippets.org/snippets/1034/ 中使用了一个sn-p 来继承我的模型。一开始它工作得很好。但是,在我删除数据库中的一些元素后,代码会出错。 在调试时,我发现问题出在方法中:as_leaf_class。 在以下代码中:
if (model == Meal):
return self
return model.objects.get(id=self.id)
当元素被删除时,最后一行将引发异常。 任何人都可以为此提供解决方案?
具有内容类型和继承感知管理器的模型继承
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()
【问题讨论】:
-
请告诉我们引发了什么异常。对象不存在?堆栈跟踪可能会有所帮助。
标签: django inheritance model