为什么我们必须在已经创建并保存配置文件的情况下保存该配置文件的实例?

Why do we have to save instance of a profile when that profile is already created and saved?

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

我在这里遗漏了什么或者我不明白还是我们不需要第二个街区?请帮助我理解这一点,并提前谢谢你。

您应该与该教程的作者联系。

这背后的原因不是为了创作,而是为了更新。例如,您可以这样做来更新现有用户及其个人资料:

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

在那里,您已经对用户调用了 save,但是如果没有第二个信号,您还没有保存链接的配置文件。该信号旨在确保当您调用 user.save() 时,配置文件也会自动保存。

但这不是我喜欢的模式,也不推荐。如果您要更改一个对象,您有责任保存它 - 在上面的代码中,您应该调用 user.profile.save() 而不是依赖信号。