Python 使用django模型扩展和加载正确的内容类型

Python 使用django模型扩展和加载正确的内容类型,python,django,models,Python,Django,Models,我从另一个开发人员那里继承了一个应用程序 class LowLevelModel(models.Model): content = models.TextField() def get_absolute_url(self): from foo.pages.models import DynamicPage from django.contrib.contenttypes.models import ContentType my_type = ContentType.object

我从另一个开发人员那里继承了一个应用程序

class LowLevelModel(models.Model):
 content = models.TextField()

 def get_absolute_url(self):
  from foo.pages.models import DynamicPage
  from django.contrib.contenttypes.models import ContentType
  my_type = ContentType.objects.get_for_model(self)    
  try:
   dynamic_page = DynamicPage.objects.get(content_type=my_type)
   return "%s%s/" % (dynamic_page.get_absolute_url(), self.slug)
  except DynamicPage.DoesNotExist:
   return "/resources/"
class HighLevelModel(LowLevelModel):
 def get_absolute_url(self):
  from foo.pages.models import DynamicPage
  from django.contrib.contenttypes.models import ContentType
  my_type = ContentType.objects.get_for_model(self)    
  try:
   dynamic_page = DynamicPage.objects.get(content_type=my_type)
   return "%s%s/" % (dynamic_page.get_absolute_url(), self.slug)
  except DynamicPage.DoesNotExist:
   return "/resources/"

class ResourceFeed(Feed):
 title="Something awesome"
 link = '/resources/'
 def items(self):
  return LowLevelModel.objects.order_by('pub_date').reverse()[:5]

当然,这可能会返回LowLevelModel绝对URL,我想知道是否有人知道一种调用LowLevelModel.objects的廉价方法,而不必通过所有扩展模型循环以获得站点上的正确位置。

您可以使用
generic.GenericRelation
,(请参阅:)但这种关系有点奇怪,因为假设任何给定模型都只有一个
DynamicPage


您至少可以消除
HigherLevelModel
上的
get\u absolute\u url
的重复。
LowerLevelModel
上的
get\u absolute\u url
方法足够通用,可以处理任何子类。

我不知道这是否是您想要的,但我在github上编写了一个名为django\u subclass的奇怪扩展,它允许在调用基类管理器时返回正确的对象类(本例中为低电平)

您只需注册您的子类化模型,它将使用外部contenttype为您处理该问题