Django配置文件没有保存

时间:2014-07-29 00:53:23

标签: django-models lambda

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

上下文: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(),如果是,我的代码有什么问题。

1 个答案:

答案 0 :(得分:0)

问题是lambda函数调用的配置文件没有被缓存,所以在asigment之后,当我在实例上调用save时,我实际上是在一个新的配置文件的干净实例上调用save。