Я согласен с решением ролей, как изображено Алексом. То, что у вас есть, это не разные подклассы людей. У вас есть разные роли, которые может иметь человек.
Но я слышу, как вы говорите: «эй, ниндзя может иметь свойство« numberOfStars », а певец может иметь свойство« самое большое примечание ». То же, что и для интерфейса: ниндзя может иметь метод throwStar () и исчезнуть. (), в то время как у певца могут быть функции sing () и getWasted (), а у басиста - goFunky () и slapPop ()
Здесь у вас есть случай, когда вашей модели данных нужна очень свободная схема. Так свободно, что на самом деле у вас нет схемы вообще. Если певец решает взять бас и импровизировать мелодию, это нормально. Если он хочет действовать как ниндзя, и вы вызываете throwStar, он выдаст ошибку, потому что у него нет звезд, но вы в принципе можете назначить звезды певцу и заставить его бросать звезды.
В чем вы рискуете, так это в мире онтологий, а не схем. У вас есть ресурс, который является «чем-то», и это что-то может быть некоторого типа, иметь некоторые свойства и т. Д. Наличие некоторых свойств может выводить тип, или присутствие какого-либо типа может выводить другие типы. Вы не можете легко описать эту информацию с помощью простой модели данных django. Вам понадобится контекстно-зависимое хранилище графиков, такое как AllegroGraph, или реализация вашего взломанного решения с использованием rdflib.