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

问题描述 投票:0回答:1

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

django post django-models django-forms django-views
1个回答
2
投票

你定义了从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()
© www.soinside.com 2019 - 2024. All rights reserved.