• 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字段对应的注释
  • 相关阅读:
    Raft协议备注
    领域建模笔记
    Spark编程模型
    Spark如何删除无效rdd checkpoint
    Parquet 列式存储格式
    SpringBoot中ConditionalOnClass注解的原理
    SpringBoot定制Sevlet容器原理
    分析JDK的动态代理原理
    简述SpringCloud底层原理
    简述SpringCloud框架
  • 原文地址:https://www.cnblogs.com/zhengyuli/p/11016930.html
Copyright © 2020-2023  润新知