Django: при расширении User лучше использовать OneToOneField (User) или ForeignKey (User, unique = True)?

Вы пытались разобрать исполняемый файл и сравнить разборку? Это должно удалить много отвлекающих деталей, которые вы упомянули, и сделать удаление других намного проще.

29
задан Daniel Holmes 15 August 2018 в 15:25
поделиться

2 ответа

Единственная реальная причина, указанная в статье, заключается в том, что ее можно настроить так, чтобы на странице администратора для пользователя отображались оба поля в Пользователь ] и Профиль пользователя . Это можно воспроизвести с помощью OneToOneField с небольшим количеством смазки, поэтому, если вы не хотите показывать его на странице администратора без какой-либо работы за счет некоторой ясности («Мы можем создать несколько профилей на пользователя ?! О нет, подождите, он уникален. ") Я бы использовал OneToOneField .

18
ответ дан 28 November 2019 в 02:01
поделиться

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

7
ответ дан trybik 15 August 2018 в 15:25
поделиться
Другие вопросы по тегам:

Похожие вопросы: