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

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了'RelatedManager'对象没有属性'save'相关的知识,希望对你有一定的参考价值。

这是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'

答案

你定义了从ForeignKeyProfileUser,但这意味着每个Profile都与User相连,但是完全有可能将多个Profiles连接到同一个User

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

我认为你真的想要将Profiles与不同的Users相关联,在这种情况下你最好使用OneToOneField

class Profile(models.Model):
    user = models.OneToOneField(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()

以上是关于'RelatedManager'对象没有属性'save'的主要内容,如果未能解决你的问题,请参考以下文章

TypeError:“RelatedManager”对象不可迭代

在 Django 2 中模拟 RelatedManager

关联管理器(RelatedManager)

关联管理器(RelatedManager)

Django:RelatedManager 对象是如何实例化的?

Django RelatedManager 的 .create() 用法?