Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/django/19.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Django-如何从字段中删除F()?_Django_Expression - Fatal编程技术网

Django-如何从字段中删除F()?

Django-如何从字段中删除F()?,django,expression,Django,Expression,使用F()(请参阅)执行查询后,我保存了对象,但随后需要再次保存它。我想从字段中删除F()。如果不这样做,则会再次调用F() 比如说 rank.ammountMatchesRanked = F('ammountMatchesRanked') + 1 rank.save() # does ammountMatchesRanked = ammountMatchesRanked + 1 ... # Manipulating more rank fields (can't manipulate befo

使用
F()
(请参阅)执行查询后,我保存了对象,但随后需要再次保存它。我想从字段中删除F()。如果不这样做,则会再次调用F()

比如说

rank.ammountMatchesRanked = F('ammountMatchesRanked') + 1
rank.save() # does ammountMatchesRanked = ammountMatchesRanked + 1
... # Manipulating more rank fields (can't manipulate before)
rank.save() # does ammountMatchesRanked++ again (undesired)
知道如何清除参考字段吗?我搜索了文档,但没有找到


提前谢谢

我在django不是很好,但是这样做怎么样:

rank.ammountMatchesRanked = F('ammountMatchesRanked');
就在第二次调用之前?

为什么在这里使用
F()
F
实际上是在查询中使用的,在查询中,您只需要获取那些具有某个属性且与同一模型中的另一个属性存在某种关系的对象。一旦获得了对象,就不需要使用它-您只需在标准Python中执行即可:

rank.ammountMatchesRanked += 1
rank.save()
在评论后编辑否,您误解了延迟加载是什么。它适用于queryset中的实例(即数据库行),而不是实例中的字段(即列)。因此,一旦您访问了一个实例,Django在默认情况下将加载它的所有字段(除了您用
defer()
标记的字段),因此上述操作不会导致额外的查询


在您链接到的更新中使用
F()
的文档说明,只有在您没有对对象执行任何其他操作的情况下,才可以使用该更新。是的,所以这不是一个优化。

嘿,dusoft,这成功了,谢谢!在将您标记为已接受的解决方案之前,我将等待,看看是否有人有更好的方法。按照您的建议,可能会在更新查询中插入类似SET-ammontMatchesRanked=ammontMatchesRanked的内容,这是不必要的,因为没有选项可以取消设置(rank.ammontMatchesRanked)?恐怕这是不可能的。不,这不仅仅用于此用途。检查我是否执行
rank.ammontMatchesRanked+=1
它将访问
ammontMatchesRanked
的值,从而产生额外的查询。这个物体以前从未使用过。Django使用了一种惰性机制,它只会在您实际使用该对象时进行查询。不,请参阅我上面的进一步解释。但是您会在第一次save()之后继续执行更多操作。这意味着您实际执行的数据库调用比需要的要多——这与您的预期相反。通常你只会做一次更新,你的方式至少是两次。我看到丹尼尔。。。无论如何,我的问题还没有得到真正的回答,有没有办法从字段中删除F(),或者从将来的查询中删除该字段?正如我从链接的文档中看到的,F()函数用于使用
save
时包含的值更新字段,而标准
+=1
将使用从db读取对象时检索到的值。当多个用户几乎同时更新同一行时,这一点非常有用:考虑的值将始终是最后更新的值。