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

时间:2018-06-03 12:11:22

标签: django post django-models django-forms django-views

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

1 个答案:

答案 0 :(得分:2)

您从ForeignKeyProfile定义了User,但这意味着每个Profile都附加到 a {{1}但是,多个 User完全可以附加到相同的 Profile

因此,如果您使用User,则不会返回 a_user.profile,而是Profile:一位经理管理RelatedManager集合(可包含零个,一个或多个元素)。

但我认为您确实希望将Profile不同 Profile相关联,在这种情况下,您最好使用OneToOneField

User

如果您随后查询class Profile(models.Model): user = models.OneToOneField(User, unique=True, on_delete=models.CASCADE),您将获得someuser.profile个实例,或者如果没有与该用户相关联的个人资料,则会引发Profile错误。

默认情况下,Profile.DoesNotExists的{​​{1}}是小写的类名,因此您不再需要指定它。

但请注意,在您的代码related_name中,不是是必要的,因为OneToOneField基本上已经通过创建来保存:

instance.profile.save()