Наследование нескольких таблиц 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, А также посмотрите замечательную статью Джеффа Элмора на эту тему. Довольно старый, но все равно отличный.

Другие вопросы по тегам