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为您处理该问题