Django models Django配置文件未保存
这让我忙碌了一段时间,我希望你能帮助我 上下文:UserA和UserB在某种程度上是相关的。在UserA配置文件的updateview中,我还需要对UserB的配置文件进行一些更改,但是,尽管视图运行时没有错误,但UserB配置文件上的更改不会保存(UserA配置文件上的更改会保存) 我的模型是这样的:Django models Django配置文件未保存,django-models,lambda,Django Models,Lambda,这让我忙碌了一段时间,我希望你能帮助我 上下文:UserA和UserB在某种程度上是相关的。在UserA配置文件的updateview中,我还需要对UserB的配置文件进行一些更改,但是,尽管视图运行时没有错误,但UserB配置文件上的更改不会保存(UserA配置文件上的更改会保存) 我的模型是这样的: class UserProfile(models.Model): ... fields ... class Meta: abstract = True c
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)
在运行视图之前,两个用户如下所示:
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)
视图是这样的:
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(),如果可以,我的代码有什么问题。问题是lambda函数调用的配置文件没有缓存,所以在ASIMENT之后,当我对实例调用save时,实际上,我正在对配置文件的一个新的干净实例调用save。您是在这里对用户名进行硬编码还是示例:
userB=CustomUser.objects.get(username='userB')
。如果是一个示例,请替换为实际代码。抱歉,示例代码是因为userB返回良好。而不是self.request.user
尝试使用表单的username字段。我刚刚尝试对userB对象进行更改,结果该对象返回良好。问题似乎出在.profile lambda函数上。有什么想法吗?通常,我应该能够在.profile上调用.save()(即使.profile是lambda函数)?另外:-如果我打印userB的字段,或者如果我调用返回数据的方法,我会得到预期的值。-我在ManProfile的save()方法中添加了一条print语句,现在我可以确认userB.profile.save()
已经执行,只是没有保存的值。-通过反复试验,我发现:userB.profile.save()
:save()方法已执行,但值未保存userBprofile=userB.profile
userBprofile.save()
:执行save()方法并保存值DO。