当配置文件已经创建并保存时,为什么我们必须保存配置文件的实例?

我正在学习 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)

我在这里遗漏了什么,或者我不明白,还是我们不需要第二个块?请帮助我理解这一点,并在此先感谢您。


杨魅力
浏览 178回答 1
1回答

明月笑刀无情

您应该与该教程的作者一起讨论。这背后的原因不是为了创建,而是为了更新。例如,您可以这样做来更新现有用户及其个人资料:user = request.useruser.last_name = 'Smith'user.profile.info_field = 'Some details'user.save()在那里,您已经调用save了用户,但没有第二个信号,您还没有保存链接的配置文件。该信号旨在确保当您调用时user.save(),配置文件也会自动保存。但这不是我喜欢的模式,也不推荐。如果您正在更改一个对象,您有责任保存它 - 在上面的代码中,您应该调用user.profile.save()而不是依赖信号。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Python