我正在学习 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 回答
明月笑刀无情
TA贡献1828条经验 获得超4个赞
您应该与该教程的作者一起讨论。
这背后的原因不是为了创建,而是为了更新。例如,您可以这样做来更新现有用户及其个人资料:
user = request.user
user.last_name = 'Smith'
user.profile.info_field = 'Some details'
user.save()
在那里,您已经调用save了用户,但没有第二个信号,您还没有保存链接的配置文件。该信号旨在确保当您调用时user.save(),配置文件也会自动保存。
但这不是我喜欢的模式,也不推荐。如果您正在更改一个对象,您有责任保存它 - 在上面的代码中,您应该调用user.profile.save()而不是依赖信号。
添加回答
举报
0/150
提交
取消