Django方法同样的对象没有保存

时间:2014-02-04 01:01:43

标签: python django django-models django-queryset

这是我一直试图解决的问题,现在已经解决了3天,我无法理解为什么这不起作用。

我有一个方法可以创建一个新版本的Object。它曾经工作,你会传递到对象。这将是创建新版本的源。您也可以传入目的地,这在此示例中并不重要。现在我想添加锁定到这个方法,因为我们想要添加多个用户。所以我想确保我总是拥有最新的对象,我可以从中创建一个新的对象。所以我添加了一条只能获得最新对象的线。如果数据库中没有更新的对象,那么无论如何它都是相同的。

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

在方法中我做了类似的事情

source.current = False
source.save()

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

所以现在的问题是,如果我在这种方法中使用sou,一切正常。我可以保存它等..但是一旦我使用源和初始不在args它只是不保存它。 print语句告诉我它们是相同的。保存后我打印的所有内容都告诉我它已被保存,但它没有这样做。

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 current = True。

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

如果我将对象传入方法但是当我在方法中获得完全相同的对象时开始失败,为什么它没有问题呢?

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

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

2 个答案:

答案 0 :(得分:1)

感谢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但当然解锁(x)仍然引用了一个“旧的”未更新的对象,当然还是再次保存它。因此它覆盖了我在createRevision中的更改。

再次感谢所有帮助过此事的人。

答案 1 :(得分:0)

我认为你可能与模型管理器缓存相冲突,模拟管理器缓存旨在限制数据库查询。但是,通过调用模型管理器上的.all() method,您可以强制它再次访问数据库。

所以,试试这个:将你的参数从BaseItem类替换为模型管理器的.all() QuerySet:

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作为第一个参数,因此这是有效的。