Почему мы должны сохранять экземпляр профиля, если этот профиль уже создан и сохранен? - PullRequest
0 голосов
/ 16 апреля 2019

Я следую учебному пособию в Django, и у меня есть некоторые проблемы с пониманием кода ниже:

@receiver(post_save, sender=User)
def create_profile(sender, instance, created, **kwargs):
    if created:
        Profile.objects.create(user=instance)

# why do we need to save instance? 'Profile.objects.create' already created and save that for us
@receiver(post_save, sender=User)
def save_profile(sender, instance, **kwargs):
    instance.profile.save()

Это означает, что если пользователь создает учетную запись или регистрируется на сайте, используя сигналы, будет создан профильавтоматически связывается с этим пользователем.

Вопрос в том, зачем нам сохранять экземпляр профиля, потому что Profile.objects.create(user=instance) уже создал и сохранил этот экземпляр одновременно.

Даже если я опущу второй блок вышеприведенного кода, он все равно будет работать нормально:

@receiver(post_save, sender=User)
def create_profile(sender, instance, created, **kwargs):
    if created:
        Profile.objects.create(user=instance)

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

1 Ответ

3 голосов
/ 16 апреля 2019

Вы должны обсудить это с авторами этого урока.

Причина этого не в творчестве, а в том, когда вы обновляете. Например, вы можете сделать это для обновления существующего пользователя и его профилей:

user = request.user
user.last_name = 'Smith'
user.profile.info_field = 'Some details'
user.save()

Там вы позвонили пользователю save, но без второго сигнала вы не сохранили связанный профиль. Сигнал предназначен для того, чтобы при вызове user.save() профиль также сохранялся автоматически.

Но это не тот шаблон, который мне вообще нравится, и я не рекомендую его. Если вы меняете объект, вы несете ответственность за его сохранение - в приведенном выше коде вы должны вызывать user.profile.save(), а не полагаться на сигнал.

...