Django DB模型F组合表达

Mut*_*vel 6 python database django model

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
Run Code Online (Sandbox Code Playgroud)

保存帖子后,它返回组合表达式.

我想要确切的结果(3).

是否可以不再调用get方法?

Ala*_*air 10

在Django 1.8+中,您可以使用该refresh_from_db方法.它不会保存任何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
Run Code Online (Sandbox Code Playgroud)

由于更新发生在数据库中,因此如果不执行a get()或a refresh_from_db(这两者都会导致类似的SQL查询),就无法在Django中获取新值.但是,可以get()通过使用来避免初始化update().

>>> Post.objects.filter(id=1).update(view_count=F('view_count') + 1)
>>> post = Post.objects.get(id=1)
>>> post.view_count
3
Run Code Online (Sandbox Code Playgroud)


Nho*_*hor -4

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

  • `post.view_count = F('view_count') + 1` 的优点是它*总是*将值加一。如果两个用户同时执行`post.view_count += 1`,则该值可能会更新1,而不是2。 (5认同)