Для моделей Django существует два типа наследования: абстрактное и конкретное.
В первом случае нет ни таблицы для абстрактного базового класса, ни «родительской записи», каждая дочерняя модель имеет собственную полную таблицу со всеми полями (унаследованными и принадлежащими).
В Во втором случае (также известном как «наследование нескольких таблиц») есть одна таблица для родительской модели с полями родительской модели и одна таблица для каждой дочерней модели с полем OneToOne (технически FK) в родительской таблице и дочерней модели. собственные поля. Вы можете NOT"управлять созданием" родительской записи при создании дочерней записи или создавать дочернюю запись без родительской записи (требуется fk).
You может (по крайней мере, технически) создать родительскую запись без дочернего элемента, а затем создать дочерний элемент и связать его с родителем (что на самом деле Django делает под капотом, когда вы создаете дочернюю запись с момента дочерней записи). требует фк к родителю) но это ИМХО сильный запах дизайна - если для вашего приложения имеет смысл иметь родительскую запись без потомка, вероятно, вам вообще не следует использовать наследование (вы можете использовать поля OneToOne без наследования).
по отношению к OneToOneField.parent_link
: когда вы используете конкретное наследование и явно не предоставляете поле OneToOne для родительской модели Django создаст его для вас (точно так же, как это создает поле первичного ключа, если вы явно не определяете его). Если вы хотите явно определить поле OneToOne для своей родительской модели в дочерней модели, вы должны указать Django, что это поле OneToOne является ссылкой на родительский объект и что 'для чего этот флаг.
Последнее замечание: по опыту наследование нескольких таблиц (независимо от того, какой у вас уровень доступа к данным - django orm, slqalchemy, обычное руководство SQL et c) всегда немного PITA, поэтому используйте его только где это действительно имеет смысл.