这已经让我忙了一段时间,我希望你能帮助我。
上下文:UserA和UserB在某种程度上相关。在UserA的配置文件的更新视图中,我还需要对UserB的配置文件进行一些更改,但是,尽管视图运行没有错误,但UserB的配置文件中的更改不会保存(UserA' s上的更改个人资料确实已保存。)
我的模型是这样的:
class UserProfile(models.Model):
... fields ...
class Meta:
abstract = True
class ManProfile(UserProfile):
some_flag = models.BooleanField(default=False)
... more fields ....
class WomanProfile(UserProfile):
some_flag = models.BooleanField(default=False)
... more fields ....
def get_profile(user):
if user.user_type == 'm':
obj, created = ManProfile.objects.get_or_create(user=user)
return obj
elif user.user_type == 'f':
obj, created = WomanProfile.objects.get_or_create(user=user)
return obj
else:
return None
CustomUser.profile = property(lambda u: get_profile(u))
在视图运行之前,两个用户都是这样的:
userA.profile.some_flag = False
userB.profile.some_flag = False
视图是这样的:
class ProfileUpdate(UpdateView):
... stuff ...
def form_valid(self, form):
userB = CustomUser.objects.get(username=self.request.user.profile.friend_username)
userB.profile.some_flag = True
userB.profile.save()
form.instance.some_flag = True
return super(ProfileUpdate, self).form_valid(form)
视图运行后,结果为:
userA.profile.some_flag = True
userB.profile.some_flag = False
保存UserA的个人资料(由表单处理)但UserB的个人资料不存在(虽然我正在呼叫userB.profile.save()
)。
如果我将视图更改为这样的内容,则会保存两个配置文件:
class ProfileUpdate(UpdateView):
... stuff ...
def form_valid(self, form):
userB = CustomUser.objects.get(username=self.request.user.profile.friend_username)
userB.manprofile.some_flag = True
userB.manprofile.save()
form.instance.some_flag = True
return super(ProfileUpdate, self).form_valid(form)
我停止使用lambda函数,而是直接调用了配置文件名称(在这种情况下是manprofile,因为两个用户都是男性),然后一切正常。所以,我的问题是,是否可以在lambda函数上调用save(),如果是,我的代码有什么问题。
答案 0 :(得分:0)
问题是lambda函数调用的配置文件没有被缓存,所以在asigment之后,当我在实例上调用save时,我实际上是在一个新的配置文件的干净实例上调用save。