В моем приложении Django у меня есть модель (назовем ее Foo) с полем с именем «type». Я хотел бы использовать Foo.type, чтобы указать, к какому типу относится конкретный экземпляр Foo (возможны следующие варианты: «Число», «Дата», «Одна строка текста», «Несколько строк текста» и несколько других). .
Есть две вещи, которые я бы хотел, чтобы поле «type» оказало влияние; способ, которым значение преобразуется из его обычного типа в текст (например, в «Дата», это может быть str(the_date.isoformat())
), и способ, которым значение преобразуется из текста в указанный тип (в «Дата», это может быть datetime.date.fromtimestamp(the_text)
).
Для меня это похоже на шаблон Стратегии (я могу быть совершенно неправ, и не стесняйтесь поправлять меня, если я так). У меня вопрос, как правильно кодировать это в веб-MVC Framework?
В клиентском приложении я бы создал класс Type с абстрактными методами "serialize ()" и "unserialize ()", переопределил эти методы в подклассах Type (таких как NumberType и DateType) и динамически установил поле «type» вновь созданного Foo для соответствующего подкласса Type во время выполнения.
В веб-среде это не так просто для меня. Прямо сейчас, способ, который имеет больше всего смысла, состоит в том, чтобы определить Foo.type как поле Small Integer и определить ограниченный набор вариантов (0 = "Число", 1 = "Дата", 2 = "Одна строка текста", и т. д.) в коде. Затем, когда создается экземпляр объекта Foo, используйте метод Factory, чтобы посмотреть значение поля «type» экземпляра и подключите правильный подкласс Type (как описано в параграфе выше). Foo также будет иметь методы serialize () и unserialize (), которые будут делегироваться напрямую подключаемому подклассу Type.
Как звучит этот дизайн? Я никогда не сталкивался с этой проблемой раньше, поэтому мне бы очень хотелось узнать, есть ли другие люди, и как они решили ее.