gpt4 book ai didi

django - 'RelatedManager' 对象没有属性 'save'

转载 作者:行者123 更新时间:2023-12-02 14:59:45 36 4
gpt4 key购买 nike

这是models.py代码

class Profile(models.Model):
user = models.ForeignKey(User, unique=True, on_delete=models.CASCADE, related_name='profile')



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


@receiver(post_save, sender=User)
def save_user_profile(sender, instance, **kwargs):
# Profile.objects.save()
instance.profile.save()

这是 views.py 代码:

def signup(request):
....

if request.method == "POST":
user_form = UserRegistrationForm(request.POST)

if user_form.is_valid():
user = user_form.save(commit=False)
user.save(using='default')
login(request, user)
return HttpResponse("User Loged In")

然后在填写注册表单并单击提交按钮后,Django 得到以下错误: 'RelatedManager' object has no attribute 'save'

最佳答案

您定义了一个 ForeignKey来自ProfileUser ,但这意味着每个 Profile附加到a User , 然而完全有可能 多个 Profile s 附加到相同 User .

因此,如果您使用 a_user.profile ,它将返回单个 Profile ,而是一个 RelatedManager : 管理 Profile集合(可以包含零个、一个或多个元素)的管理器.

不过我认为您实际上想要关联 Profile s 与 不同 User s,在这种情况下你最好使用 OneToOneField :

class Profile(models.Model):
user = models.<b>OneToOneField</b>(User, unique=True, on_delete=models.CASCADE)

如果你接着查询someuser.profile你要么得到一个Profile实例,否则它会引发 Profile.DoesNotExists如果没有配置文件与该用户相关联,则会出错。

默认 related_nameOneToOneField是小写的类名,因此您不再需要指定它。

但是请注意,在您的代码中 instance.profile.save() 不需要,因为 Profile , 基本上已经通过创建它保存了:

@receiver(post_save, sender=User)
def update_user_profile(sender, instance, created, **kwargs):
if created:
Profile.objects.create(user=instance)
# unnecessary
# instance.profile.save()

关于django - 'RelatedManager' 对象没有属性 'save',我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50666262/

36 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com