Наследование нескольких таблиц django, метод доступа от дочернего объекта от экземпляра родительского
Я использую наследование нескольких таблиц (также называемое конкретным наследованием), где у меня есть неабстрактная модель + таблица БД под названием "Клиенты", которая касается общих деталей, касающихся всех клиентов.
Но клиентом может быть физическое лицо, партнерство или компания, для которых я создал унаследованные модели и таблицы. Физическое лицо имеет имя + фамилия, а компания имеет другие конкретные данные и т. Д.
Я хочу иметь возможность доступа к именам клиентов (полученным из столбцов дочерних таблиц), когда мне нужен список всех клиентов.
После долгих поисков я обнаружил, что этот урок успешно работает.
По сути, это включает вставку столбца в таблицу Client, в которой будет храниться имя дочерней модели. Затем, используя это имя, определяется соответствующая дочерняя модель и осуществляется доступ к соответствующему дочернему методу.
Но это кажется немного громоздким способом реализации полиморфизма в наследовании нескольких таблиц.
Я хочу знать, внедрил ли Django более эффективный способ решения этой проблемы с 2012 года, или это все еще единственный путь?
Пожалуйста, дайте мне знать, требуется ли мой пример кода, но на приведенной ссылке уже есть прекрасный пример.
1 ответ
Есть django-model-utils
приложение с помощью Inheritance Manager. Он автоматически приведёт ваш родительский класс к дочерним экземплярам. Пример из документов:
from model_utils.managers import InheritanceManager
class Place(models.Model):
# ...
objects = InheritanceManager()
class Restaurant(Place):
# ...
class Bar(Place):
# ...
nearby_places = Place.objects.filter(location='here').select_subclasses()
for place in nearby_places:
# "place" will automatically be an instance of Place, Restaurant, or Bar
Также проверьте этот вопрос для общего решения с ContentType
, А также посмотрите замечательную статью Джеффа Элмора на эту тему. Довольно старый, но все равно отличный.