'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")
答案
你定义了从ForeignKey
到Profile
的User
,但这意味着每个Profile
都与User
相连,但是完全有可能将多个Profile
s连接到同一个User
。
因此,如果你使用a_user.profile
,它将不会返回单个Profile
,而是RelatedManager
:管理Profile
的集合(可以包含零个,一个或多个元素)的管理器。
我认为你真的想要将Profile
s与不同的User
s相关联,在这种情况下你最好使用OneToOneField
:
class Profile(models.Model):
user = models.OneToOneField(User, unique=True, on_delete=models.CASCADE)
如果您随后查询someuser.profile
,您将获得Profile
实例,否则如果没有与该用户关联的配置文件,它将引发Profile.DoesNotExists
错误。
默认情况下,related_name
的OneToOneField
是小写的类名,因此您不再需要指定它。
但请注意,在您的代码中,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”对象不可迭代