最新公告
  • 欢迎您光临起源地模板网,本站秉承服务宗旨 履行“站长”责任,销售只是起点 服务永无止境!立即加入钻石VIP
  • Django之F查询、Q查询、事务的简单介绍

    正文概述    2020-04-19   404

    Django之F查询、Q查询、事务的简单介绍

    一、F查询

    在上面所有的例子中,我们构造的过滤器都只是将字段值与某个我们自己设定的常量做比较。如果我们要对两个字段的值做比较,那该怎么做呢?

    Django 提供 F() 来做这样的比较。F() 的实例可以在查询中引用字段,来比较同一个 model 实例中两个不同字段的值。

    示例:

    建表:

    from django.db import models
    class Goods(models.Model):
        name = models.CharField(max_length=32)
        price = models.DecimalField(max_digits=8, decimal_places=2)
        remain = models.BigIntegerField()
        sold_out = models.BigIntegerField()

    插入模块

    from django.db.models import F,Q

    例子:查询卖出数量大于库存数的商品名称

    res = models.Goods.objects.filter(sold_out__gt=F('remain')).values_list('name', 'sold_out', 'remain')
    print(res)
    # <QuerySet [('袜子', 600, 100), ('夹克', 20, 10)]>

    F()可以帮我们取到表中某个字段对应的值来当作我的筛选条件,而不是我认为自定义常量的条件了,实现了动态比较的效果。

    Django 支持 F() 对象之间以及 F() 对象和常数之间的加减乘除和取模的操作。基于此可以对表中的数值类型进行数学运算。

    例子:将每个商品的价格提高50块

    res1 = models.Goods.objects.update(price=F('price')+100)

    引申:如何修改char字段,比如将上面的表中商品名称全部尾部加上‘清仓’两个字,如何操作?

    这里需要使用2个模块:Concat 和 Value

    from django.db.models.functions import Concat
    from django.db.models import Value
    res = models.Goods.objects.update(name=Concat(F('name'), Value('清仓')))

    Concat表示进行字符串的拼接操作,参数位置决定了拼接是在头部拼接还是尾部拼接,Value里面是要新增的拼接值。

    相关推荐:《Python视频教程》

    二、 Q查询

    filter()方法汇总的逗号get的条件是与的关系,如果要执行更复杂的查询,比如or的语句,就会用到Q对象。

    例子:

    查询卖出数量大于100或者价格小于300的商品名

    from django.db.models import F,Q
    res = models.Goods.objects.filter(Q(sold_out__gt=100)|Q(price__lt=300)).values_list('name', 'sold_out', 'price')
    print(res)
    <QuerySet [('袜子清仓', 600, Decimal('129.90')), ('寸衫清仓', 10, Decimal('229.90'))]>

    对条件包裹一层Q时候,filter即可支持交叉并的比较符。

    # 查询库存数是小于等于20,且卖出数不是10的产品
    res = models.Goods.objects.filter(Q(remain__lte=20)&~Q(sold_out=12)).values_list('name')

    我们可以组合& 和|  操作符以及使用括号进行分组来编写任意复杂的Q 对象。

    同时,Q 对象可以使用~ 操作符取反,这允许组合正常的查询和取反(NOT) 查询。

    # 查询产品名包含新款或者爆款,且库存大于60的产品
    res = models.Goods.objects.filter(Q(name__contains='新款')|Q(name__contains='爆款'), remain__gt=60).values_list('name')

    查询函数可以混合使用Q 对象和关键字参数。所有提供给查询函数的参数(关键字参数或Q 对象)都将"AND”在一起。但是,如果出现Q 对象,它必须位于所有关键字参数的前面。

    重点使用方法补充:

    实例化Q对象:q = Q()
    q.connector = 'or'    #  默认q之间的条件都是与关系,这里改成or关系
    q.children.append(('name','sgt'))  # 插入第一个条件,注意这里传的是一个元祖
    q.children.append(('password','123')) # 可以继续插入条件
    # q对象支持直接放入filter括号内,它们之间默认是and关系,可以通过上面的q.connect = 'or'来修改成或关系
    models.User.objects.filter(q)    # 这里面就是查询的条件们,它们之间默认是与关系,可以修改成or关系

    三、事务

    定义:将多个sql语句操作变成原子性操作,要么同时成功,有一个失败在里面就回滚到原来的状态,保证数据的完整性和一致性(NoSQL数据库对事务则是部分支持)

    # 事务
    # 购买商品
    # 产品表中修改数据:卖出数+1,库存-1
    from django.db.models import F
    from django.db import transaction
    try :
        with transaction.atomic():
            models.Goods.objects.filter(id=1).update(remain=F('remain')-1, sold_out=F('sold_out')+1)
    except Exception as e:
        print(e)

    起源地下载网 » Django之F查询、Q查询、事务的简单介绍

    常见问题FAQ

    免费下载或者VIP会员专享资源能否直接商用?
    本站所有资源版权均属于原作者所有,这里所提供资源均只能用于参考学习用,请勿直接商用。若由于商用引起版权纠纷,一切责任均由使用者承担。更多说明请参考 VIP介绍。
    提示下载完但解压或打开不了?
    最常见的情况是下载不完整: 可对比下载完压缩包的与网盘上的容量,若小于网盘提示的容量则是这个原因。这是浏览器下载的bug,建议用百度网盘软件或迅雷下载。若排除这种情况,可在对应资源底部留言,或 联络我们.。
    找不到素材资源介绍文章里的示例图片?
    对于PPT,KEY,Mockups,APP,网页模版等类型的素材,文章内用于介绍的图片通常并不包含在对应可供下载素材包内。这些相关商业图片需另外购买,且本站不负责(也没有办法)找到出处。 同样地一些字体文件也是这种情况,但部分素材会在素材包内有一份字体下载链接清单。
    模板不会安装或需要功能定制以及二次开发?
    请QQ联系我们

    发表评论

    还没有评论,快来抢沙发吧!

    如需帝国cms功能定制以及二次开发请联系我们

    联系作者

    请选择支付方式

    ×
    迅虎支付宝
    迅虎微信
    支付宝当面付
    余额支付
    ×
    微信扫码支付 0 元