Полиморфизм в модельном классе Джанго - PullRequest
1 голос
/ 07 июня 2011

У меня есть следующая модель.

CHOICES=( ('TEXT', 'TEXT'), ('IMAGE', 'IMAGE') )

type = models.CharField(max_length=10, blank=False, choices = CHOICES)
body = models.TextField()

Если поле типа TEXT, то строка базы данных содержит какой-то простой текст.Если поле типа IMAGE, то строка базы данных содержит имя файла изображения.

Я добавляю функцию print_item в класс модели для обработки обоих случаев:

def print_item(self):
  if self.type == "TEXT":
      return self.body
  elif self.type == "IMAGE":
      return "<img src='%s' />" % self.body

Этоэто явно не общий или ОО способ сделать это.Другой вариант - создать два класса image и text, каждый из которых имеет функцию print_item, а затем создать экземпляр объекта (на основе строки типа) и вызвать его функцию print_item.

Каков наилучший подход в этой ситуации?

Ответы [ 2 ]

1 голос
/ 21 сентября 2012

Мы исправили эту проблему ООП с прокси. Я модель прокси, определите вашу функцию print_item. Проблема возникает, когда вы извлекаете объект позже, так как Django будет использовать базовый класс вместо прокси.

Я написал сообщение в блоге о полном подробном решении здесь: http://anthony -tresontani.github.com / Python / 2012/09/11 / django-polymorphism /

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

Как вы сказали, ваше текущее решение на самом деле не является объектно-ориентированным или классным, но оно содержит только одну простую таблицу в БД, без внешних ключей и т. Д., Что тоже хорошо.

Если вам нужно немного поработать с каждым объектом и иметь более приятного администратора, вам могут пригодиться модели прокси: http://lincolnloop.com/blog/2010/dec/16/using-proxy-models-customize-django-admin/.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...