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