Django-DB模型F组合表达式

2024-05-14 19:43:33 发布

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

In [1]: from django.db.models import F

In [2]: from forum.models import Post

In [3]: post = Post.objects.get(id=1)

In [4]: post.view_count = F('view_count') + 1

In [5]: post.save()

In [6]: post.view_count

Out[6]: <CombinedExpression: F(view_count) + Value(1)>

In [7]: post = Post.objects.get(id=1)

In [8]: post.view_count

Out[8]: 3

保存post后,它返回组合表达式。在

我要确切的结果(3)。在

是否可以不从数据库再次调用get方法/refresh_?在


Tags: djangoinfromimportviewiddbget
3条回答

在django1.8+中,可以使用^{}方法。它不会保存任何SQL查询,但您可能认为代码更好。在

>>> post = Post.objects.get(id=1)
>>> post.view_count
2
>>> post.view_count = F('view_count') + 1
>>> post.save()
>>> post.refresh_from_db()
>>> post.view_count
3

由于更新发生在数据库中,所以不执行get()refresh_from_db(这两个操作都会导致类似的SQL查询)就不可能在Django中获得新值。但是,可以通过使用update()来避免初始的get()。在

^{pr2}$

从文档https://docs.djangoproject.com/en/1.7/ref/models/queries/#f-expressions

Python从不了解封装的SQL表达式post.view_count = F('view_count') + 1 # F('view_count') Django sql expression。在

它完全由数据库处理。在

因此,当Python知道所应用的表达式而不是结果时,对数据库所做的更改。在

你可以这样做直接:-在

post = Post.objects.filter(id=1)
post.update(view_count = F('view_count') + 1) 

你为什么不直接写post.view_count += 1?在

相关问题 更多 >

    热门问题