Django方法相同对象未保存

2024-09-28 01:30:46 发布

您现在位置:Python中文网/ 问答频道 /正文

这是我三天来一直在努力解决的问题,我就是不明白为什么这不起作用。在

我有一个方法可以创建对象的新版本。它曾经是有效的,你会通过sou obj。这就是新版本的来源。您还可以传入目的地,这在本例中并不重要。现在我想向这个方法添加锁,因为我们要添加多个用户。所以我想确定我总是有一个最新的对象,从中我创建了一个新的对象。所以我加了一行,只会得到最新的对象。如果数据库中没有更新的对象,它无论如何都是相同的。在

def createRevision(request, what, sou, destination=None, ignore = [], **args):
...
  if "initial" not in args.keys():
    source = get_object_or_404(BaseItem, ppk=sou.ppk, project=sou.project, current=True)
    print "------------"
    print source == sou
    print "------------"
    # This outputs True
  else:
    source = sou

在方法上我做了一些类似的事情

^{pr2}$

基本上,我的想法是传入BaseItem,如果我不指定“initial”关键字,那么我将从那个项目中获得当前项,并且具有相同的ppk(这是一个特殊的随机pk与current一起传导)。我这样做只是为了省钱,我真的有了最新的对象。如果它是最初的版本,我就用它,因为不可能有另一个版本。在

所以现在的问题是,如果我在这个方法中使用sou,一切都会很好。我可以保存它等等。。但是只要我使用source和initial不在args中,它就不能保存它。打印声明告诉我它们是一样的。保存后打印的所有内容都会告诉我它已被保存,但它无法做到这一点。在

source.current = False
source.save()
print "SAVED !!!!"
print source.pk
print source.current
rofl =  get_object_or_404(BaseItem, pk=source.pk, project=sou.project)
print rofl.pk
print source.current

输出相同的pk和相同的当前值,但不知何故没有正确保存。只要我查看django admin或选择current=True。在

我真的不知道该怎么办了。在

如果我把对象传入方法,但当我在方法中得到完全相同的对象时,它为什么能正常工作?在

当然,我用相同的对象调用方法:

x = get_object_or_404(BaseItem, ppk=sou.ppk, project=sou.project, current=True)
createRevision(request, "", x)

Tags: 对象方法版本projecttruesourcegetargs
2条回答

感谢pztrick对缓存的提示。我终于解决了。所以问题是我在做:

x = get_object_or_404(BaseItem, ppk=sou.ppk, project=sou.project, current=True)
createRevision(request, "", x)
# .... loads of lines of code
unlock(x)

unlock是我编写的一个方法,它只设置了一个时间戳,所以我知道没有其他用户在编辑它。所以现在的问题是我用所有正确的数据在createRevision中保存了x,但是unlock(x)仍然引用了一个“旧的”未更新的对象,当然它又保存了一次。因此它覆盖了我在createRevision中的更改。在

再次感谢所有帮忙的人。在

我认为您可能与模型管理器缓存(旨在限制数据库查询)发生冲突。但是,通过调用模型管理器上的^{} method,可以强制它再次命中数据库。在

因此,请尝试以下操作:将参数从BaseItem类替换为模型管理器的.all()查询集:

source = get_object_or_404(BaseItem.objects.all(), ppk=sou.ppk, project=sou.project, current=True)
# ...
rofl =  get_object_or_404(BaseItem.objects.all(), pk=source.pk, project=sou.project)

get_object_or_404支持模式类、模型管理器或QuerySets作为第一个参数,因此这是有效的。在

相关问题 更多 >

    热门问题