Расширение и загрузка нужного типа контента с моделями Django - PullRequest
0 голосов
/ 09 июня 2011

Я унаследовал приложение от другого разработчика ... и ...

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]

Естественно, это могло бы вернуть абсолютный URL-адрес LowLevelModel, мне было интересно, если бы кто-нибудь знал о дешевом способе вызова объектов LowLevelModel.object без необходимости циклически проходить по всем расширяющим моделям, чтобы получить правильное местоположение на сайте.

Ответы [ 2 ]

1 голос
/ 09 июня 2011

Я не знаю, если это то, что вы ищете, но я написал несколько странных расширений под названием django_subclass на github https://github.com/anthony-tresontani/django-subclass, и это позволяет получить правильный класс объектов при вызове менеджера базового класса (LowLevel... в данном случае)

Вам просто нужно зарегистрировать свою модель подклассов, и она будет обрабатывать это для вас с внешним типом контента.

0 голосов
/ 09 июня 2011

Возможно, вы сможете использовать generic.GenericRelation, (см .: https://docs.djangoproject.com/en/dev/ref/contrib/contenttypes/#reverse-generic-relations), но связь немного странная, если предположить, что для любой модели будет только один DynamicPage.

Вы можете по крайней мере избавиться от дублирования get_absolute_url на HigherLevelModel. Метод get_absolute_url на LowerLevelModel достаточно универсален, чтобы по-прежнему работать с любыми подклассами.

...