首页 > 其他分享 >django F查询

django F查询

时间:2023-01-10 11:25:44浏览次数:31  
标签:obj 查询 annotate objects 线程 django date save

目录

F查询

使用 F() 避免竞争条件

F() 可以通过以下方式提供性能优势:

  • 让数据库,而不是 Python 来完成工作, 避免了 竞争条件
  • 减少某些操作所需的查询次数

如果两个 Python 线程执行修改一个字段的值的代码,一个线程可以在另一个线程从数据库中获取一个字段的值后,检索、递增并保存它。第二个线程保存的值将基于原始值,第一个线程的工作将丢失。

如果数据库负责更新字段,那么这个过程就比较稳健:它只会在执行 save()update() 时,根据数据库中字段的值来更新字段,而不是根据检索实例时的值来更新。

F() 赋值在 Model.save() 之后持续存在

F() 分配给模型字段的对象在保存模型实例后会持续存在,并将应用于每个 save()。例如:

obj = Book.objects.get(pk=12)
print(obj.price)  # 10
obj.price = F('price') + 1
obj.save()
obj.name = '福尔摩5'
obj.save()  # 此时数据库里的price已经是12了

在这种情况下,stories_filed 将被更新两次。如果最初是 1,最终值将是 3。这种持久性可以通过在保存模型对象后重新加载来避免,例如,使用 refresh_from_db()

F对时间加减

对于 date 和 date/time 字段,你可以加上或减去一个 timedelta对象。以下会返回所有发布 3 天后被修改的条目:

>>> from datetime import timedelta
>>> Entry.objects.filter(mod_date__gt=F('pub_date') + timedelta(days=3))

查找Entry在上次修改的同一年发布的所有对象:

>>> Entry.objects.filter(pub_date__year=F('mod_date__year'))

与annotate一起使用F()

F() 可用于通过将不同的字段与算术相结合,在你的模型上创建动态字段:

company = Company.objects.annotate(
    chairs_needed=F('num_employees') - F('num_chairs'))

如果你要组合的字段是不同类型的,你需要告诉 Django 将返回什么样的字段。由于 F() 不直接支持 output_field,你需要用[ExpressionWrapper来包装表达式:

from django.db.models import DateTimeField, ExpressionWrapper, F

Ticket.objects.annotate(
    expires=ExpressionWrapper(
      	# 活动时间          持续时间
        F('active_at') + F('duration'), output_field=DateTimeField()))

标签:obj,查询,annotate,objects,线程,django,date,save
From: https://www.cnblogs.com/zonghan/p/17039595.html

相关文章

  • Django中使用内连接(子查询)
    目录在Django中使用内连接(子查询)Subquery()Exists()在Django中使用内连接(子查询)Subquery()模型类可能如下所示:classCategory(models.Model):name=models.C......
  • es基础查询语法
    1、es基础查询1.1准备数据#准备数据PUTtest_index/_doc/1{"name":"顾老二","age":30,"from":"gu","desc":"皮肤黑、武器长、性格直","tags":["黑......
  • 解决ES只能查询10000条数据的问题
    最近在从mysql同步到Elasticsearch,同步完成之后,在测试的时候发现会报错"reason”:"Resultwindowistoolarge,from+sizemustbelessthanorequalto:[10000]bu......
  • ModuleNotFoundError: No module named 'django'
    问题:安装完包无法导入安装出现:[root@a928bac91186project]#pipinstalldjango==2.2Requirementalreadysatisfied:django==2.2in/usr/local/lib/python3.6/site-p......
  • cookie与session简介 django操作cookie django操作session
    目录cookie与session简介早期cookies随机字符串解决cookies安全问题禁止浏览器保存cookiesdjango操作cookieset_cookieset_signed_cookierequest.COOKIESdelete_cookie用户......
  • 关于MyBatis查询属性封装到对象,对象为null的情况源码分析
    源码分析在DefaultResultSetHandler类中getRowValue方法创建映射类相应的对象,如果为列匹配到的值标识foundValues是false,表示没有为对象中任何一个字段映射到一个值,则......
  • mysql字符集不同导致关联查询一直卡主send data
    【1】前提(1)语句 on关联的2个表字段都有索引,变成了笛卡尔积,走了几百秒都没出来。(2)表字符集与服务器字符集t_settle_apply是utf8mb4格式,order_basicinf为u......
  • Django模板控制结构(for/forloop/if)
    for语法:{%for%}  {%endfor%} 视图 模板 结果forloopforloop.counter和forloop.revcounter后面带0代表从第0次开始循环,不带代表......
  • Django orm 字段别名
    Djangoorm数据查询结果给字段取别名sql写法类似:selectnameasusername,idasuseridfromusersDjango实现修改列明的方法有两种:方法1:annotatefromdjango.......
  • mysql 查询当天过生日sql
           线上发现有这么一个慢sql:查询当天生日的用户,由于用户量达到了百万级,原来的慢sql如下:       selectt1.idasid,t1.user_name,t1.re......