Django models Django配置文件未保存

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

这让我忙碌了一段时间,我希望你能帮助我

上下文:UserA和UserB在某种程度上是相关的。在UserA配置文件的updateview中,我还需要对UserB的配置文件进行一些更改,但是,尽管视图运行时没有错误,但UserB配置文件上的更改不会保存(UserA配置文件上的更改会保存)

我的模型是这样的:

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。