Вы пытались разобрать исполняемый файл и сравнить разборку? Это должно удалить много отвлекающих деталей, которые вы упомянули, и сделать удаление других намного проще.
Единственная реальная причина, указанная в статье, заключается в том, что ее можно настроить так, чтобы на странице администратора для пользователя
отображались оба поля в Пользователь
] и Профиль пользователя
. Это можно воспроизвести с помощью OneToOneField
с небольшим количеством смазки, поэтому, если вы не хотите показывать его на странице администратора без какой-либо работы за счет некоторой ясности («Мы можем создать несколько профилей на пользователя ?! О нет, подождите, он уникален. ") Я бы использовал OneToOneField
.
Помимо встроенной страницы администратора, другой причиной решения ForeignKey
является то, что оно позволяет вам использовать правильный менеджер БД по умолчанию, когда к объектам обращаются по обратной связи. Рассмотрим пример из этого фрагмента менеджера подклассов . Допустим, определение класса Post
из примера выглядит следующим образом:
class Post(ParentModel):
title = models.CharField(max_length=50)
onetoone = models.ForeignKey(SomeModel, unique=True)
children = ChildManager()
objects = models.Manager()
Вызывая somemodel_instance.post_set.all()[0]
, вы получаете нужные объекты подклассов класса Post
, как указано путем определения первого ( по умолчанию) менеджер в качестве ChildManager
. С другой стороны, с помощью OneToOneField
, вызвав somemodel_instance.post
, вы получите экземпляр класса Post
. Вы всегда можете позвонить в somemodel_instance.post.subclass_object
и получить тот же результат, но менеджер по умолчанию может выполнить любой другой вид трюков, а решения FK
прекрасно их скрывают.
Если вы владеете и можете изменять пользовательский код менеджера, вы можете использовать атрибут use_for_related_fields
вместо использования FK вместо допустимого поля 1to1, но даже это может дать сбой из-за некоторых неизвестных меня раздражают автоматические менеджеры. Насколько я помню, в приведенном выше примере это не получится.