zoukankan      html  css  js  c++  java
  • Django—F查询与Q查询

    F查询

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

    查询出卖出数大于库存数的商品
    
    from django.db.models import F
    ret1=models.Product.objects.filter(maichu__gt=F('kucun'))
    print(ret1)

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

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

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

    models.Product.objects.update(price=F('price')+50)

    如果要修改char字段咋办?

    把所有书名后面加上'新款',(这个时候需要对字符串进行拼接Concat操作,并且要加上拼接值Value)

    from django.db.models.functions import Concat
    from django.db.models import Value
    ret3=models.Product.objects.update(name=Concat(F('name'),Value('新款')))

    Q查询

    filter() 等方法中逗号隔开的条件是与的关系。 如果你需要执行更复杂的查询(例如OR语句),你可以使用Q对象

    将每个商品的价格提高50块
    
    from django.db.models import Q
    models.Product.objects.filter(Q(maichu__gt=100)|Q(price__lt=100))
    查询 库存数是100 并且 卖出数不是0 的产品
    
    models.Product.objects.filter(Q(kucun=100)&~Q(maichu=0))

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

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

    查询产品名包含新款, 并且库存数大于60的
    
    odels.Product.objects.filter(Q(kucun__gt=60), name__contains="新款")

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

    事物

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

    # 事务
    原子性
    一致性
    隔离性
    持久性
        # 买一本 跟老男孩学Linux 书
        # 在数据库层面要做的事儿
        # 1. 创建一条订单数据
        # 2. 去产品表 将卖出数+1, 库存数-1
        from django.db.models import F
        from django.db import transaction
        # 开启事务处理
        try:
            with transaction.atomic():
                # 创建一条订单数据
                models.Order.objects.create(num="110110111", product_id=1, count=1)
                # 能执行成功
                models.Product.objects.filter(id=1).update(kucun=F("kucun")-1, maichu=F("maichu")+1)
        except Exception as e:
            print(e)

    only/defer

    defer('id','name'):取出对象,字段除了id和name都有
    only('id','name'):取的对象,只有id和name
    如果点,依然能点出其它列,但是不要点了,因为取没有的列,会再次查询数据库

     choice字段

    class User(models.Model):
        name = models.CharField(max_length=32)
        password = MyCharField(max_length=32)
        choices = ((1,'重点大学'),(2,'普通本科'),(3,'专科'),(4,'其他'))
        education = models.IntegerField(choices=choices)
        
    user_obj.education  # 拿到的是数字
    user_obj.get_education_display()  # 固定用法 获取choice字段对应的注释
  • 相关阅读:
    Spring spEL
    Spring 使用外部部署文件
    Spring 自动装配
    spring 属性配置细节
    hdu 1054 Strategic Game
    fzu 2037 Maximum Value Problem
    将博客搬至CSDN
    HDU 4714 Tree2Cycle
    HDU 1009 The Shortest Path in Nya Graph
    POJ 1942 Paths on a Grid 组合数的优化
  • 原文地址:https://www.cnblogs.com/zhengyuli/p/11016930.html
Copyright © 2011-2022 走看看