Django ORM 之F、Q查询与事务

内容目录

  一、F、Q查询
  二、事务
  三、only与defer

一、F、Q查询

"""
    Product表中的数据:
    1    橡皮           2       2000    3000
    2    铅笔             3        12    200
    3    华为保时捷    18000    30    23
    4    索尼A6000    3680    24    12
"""
# 查询卖出数大于50的商品
# res = models.Product.objects.filter(maichu__gt=50)
# <QuerySet [<Product: 商品对象的名字:橡皮>]>
1. F查询
当想让两个字段进行比较的时候,就需要Django的F()来实现。

(1)先导入F、Q
     from django.db.models import F,Q

(2)查询卖出数大于库存数的商品
    res = models.Product.objects.filter(maichu__gt=F(‘kucun‘))
    # <QuerySet [<Product: 商品对象的名字:华为保时捷>, <Product: 商品对象的名字:索尼A6000>]>

(3)将所有的商品的价格提高100块
    models.Product.objects.update(price=F(‘price‘)+100)
    """
    修改完价格之后的表数据:
    1    橡皮          102       2000   3000
    2    铅笔          103        12       200
    3    华为保时捷     18100      30      23
    4    索尼A6000        3780    24        12
    """

(4)将所有商品的名字后面都加上:‘特供‘
    from django.db.models.functions import Concat
    from django.db.models import Value
    models.Product.objects.update(name=Concat(F(‘name‘), Value(‘特供‘)))

    解释:单纯的使用 name=F(‘price‘)+‘特供‘ 是行不通的,还得
    """
    修改之后的数据:
    1    橡皮特供            102       2000  3000
    2    铅笔特供            103        12      200
    3    华为保时捷特供         18100      30   23
    4    索尼A6000特供        3780    24     12
    """
2. Q查询
(1)res = models.Product.objects.filter(price=102)
    # <QuerySet [<Product: 商品对象的名字:橡皮特供>]>

(2)res = models.Product.objects.filter(Q(price=103), Q(name=‘橡皮特供‘))  # and
    # <QuerySet []>

(3)res = models.Product.objects.filter(Q(price=103) | Q(name=‘橡皮特供‘))  # or
    # <QuerySet [<Product: 商品对象的名字:橡皮特供>, <Product: 商品对象的名字:铅笔特供>]>

(4)二者混合使用   需要注意的是Q对象必须放在普通的过滤条件前面
    res = models.Product.objects.filter(~Q(name=‘橡皮特供‘), price=103)
    # <QuerySet [<Product: 商品对象的名字:铅笔特供>]>   非橡皮特供,且价格为103的商品

 # 当要查询的条件是用户输入进来的时候,可以动态的添加
    q = Q()
    q.connector = ‘or‘  # 通过这个参数可以将Q对象默认的and关系变成or
    q.children.append((‘price‘, 102))
    q.children.append((‘name‘, ‘橡皮特供‘))
    res = models.Product.objects.filter(q)  # Q对象查询默认也是and
    # <QuerySet [<Product: 商品对象的名字:橡皮特供>]>

二、事务

(1)事务的ACID
     """
     原子性
     一致性
     隔离性
     持久性
     """
(2) 代码实现:
    from django.db import transaction
    from django.db.models import F
    with transaction.atomic():
        # 在with代码块儿写你的事务操作
        models.Product.objects.filter(id=1).update(kucun=F(‘kucun‘)-1)
        models.Product.objects.filter(id=1).update(maichu=F(‘maichu‘)+1)
        # 写其他代码逻辑

三、only与defer

1.作为参照的例子
res = models.Product.objects.values(‘name‘)
<QuerySet [{‘name‘: ‘橡皮特供‘}, {‘name‘: ‘铅笔特供‘}, {‘name‘: ‘华为保时捷特供‘}, {‘name‘: ‘索尼A6000特供‘}]>

2.only和defer,查询拿到的都是对象,但是两者是相反的

res = models.Product.objects.only(‘name‘)
res = models.Product.objects.defer(‘name‘)
for i in res:
    print(i.name)

(1)从执行结果来看,都会出现下面的查询结果,区别在于,only 执行的SQL语句,只会将指定字段的数据取出来,defer则是取出除指定的字段的其他所有数据,
(2)但是呢,取出的对象,还是可以点出相应字段的属性,他是会去执行相应的SQL语句,再次去数据库中查询数据。
(3)上面代码执行的结果如下(结果相同):
# <QuerySet [<Product: 商品对象的名字:橡皮特供>, <Product: 商品对象的名字:铅笔特供>, <Product: 商品对象的名字:华为保时捷特供>, <Product: 商品对象的名字:索尼A6000特供>]>


原文地址:https://www.cnblogs.com/xt12321/p/11018789.html

时间: 2024-10-06 11:06:40

Django ORM 之F、Q查询与事务的相关文章

Django ORM的F Q和extra操作

orm的F功能 假设数据库有一个员工表,表中的年龄都自加"1",这里就需要到orm的F功能,如下面的代码: from django.db.models import F#首先要导入这个F模块 models.Uinfo.objects.all().update(age=F("age")+1)#这里的F功能后面的age,它就会让数据表表中的age这列+1 F 就是用来更新获取原来值的功能 orm的Q功能 数据库的查询条件我们可以使用filter,在filter里面的可以

python 之 Django框架(orm单表查询、orm多表查询、聚合查询、分组查询、F查询、 Q查询、事务、Django ORM执行原生SQL)

12.329 orm单表查询 import os if __name__ == '__main__': # 指定当前py脚本需要加载的Django项目配置信息 os.environ.setdefault("DJANGO_SETTINGS_MODULE", "orm_demo.settings") import django django.setup() # 启动Django项目 from app01 import models #返回QuerySet对象的方法: r

python3开发进阶-Django框架中的ORM的常用操作的补充(F查询和Q查询,事务)

阅读目录 F查询和Q查询 事务 一.F查询和Q查询 1.F查询 查询前的准备 class Product(models.Model): name = models.CharField(max_length=32) price = models.DecimalField(max_digits=10, decimal_places=2) # 库存数 inventory = models.IntegerField() # 卖出数 sale = models.IntegerField() def __s

Django first()和last() Q查询

分别返回queryset的第一项与最后一项,具体用法如下: p = Blog.objects.order_by('title').first() 等同于: try: p = Blog.objects.order_by('title')[0] except IndexError: p = None 原文地址:https://www.cnblogs.com/hooo-1102/p/12078344.html

Django:表多对多查询、聚合分组、FQ查询、事务

1表多对多的关系查询 准备工作创建表结构 from django.db import models # Create your models here. class Publisher(models.Model): name = models.CharField(max_length=32, verbose_name="名称") def __str__(self): return self.name class Book(models.Model): title = models.Ch

聚合与分组查询,F与Q查询

from django.db.models import Q 查询书籍名称是python入门或者价是555.55的书 book_queryset = models.Book.objects.filter(Q('title'='python入门')|Q('price'=555.55)) print(book_queryset) Q查询进阶用法 用Q产生对象 然后再使用 q = Q() q.connector('or') 添加查询条件 title__icontains为查询条件,同其他查询方式的写法

Python之路【第二十一篇】Django ORM详解

ORM回顾 关系对象映射(Object Relational Mapping,简称ORM). django中遵循 Code Frist 的原则,即:根据代码中定义的类来自动生成数据库表. 对于ORM框架里: 我们写的类表示数据库的表 如果根据这个类创建的对象是数据库表里的一行数据 对象.id 对象.value 是每一行里的数据 http://www.cnblogs.com/luotianshuai/p/5301343.html 梳理 首先在理解ORM的时候,我们可以把一对多.多对多 分为正向和反

Django学习【第7篇】:Django之ORM跨表操作(聚合查询,分组查询,F和Q查询等)

django之跨表查询及添加记录 一:创建表 书籍模型: 书籍有书名和出版日期,一本书可能会有多个作者,一个作者也可以写多本书,所以作者和书籍的关系就是多对多的关联关系(many-to-many);     一本书只应该由一个出版商出版,所以出版商和书籍是一对多关联关系(one-to-many). 创建一对一的关系:OneToOne("要绑定关系的表名") 创建一对多的关系:ForeignKey("要绑定关系的表名") 创建多对多的关系:ManyToMany(&qu

Django之ORM跨表操作(聚合查询,分组查询,F和Q查询等)

一:创建表 书籍模型: 书籍有书名和出版日期,一本书可能会有多个作者,一个作者也可以写多本书,所以作者和书籍的关系就是多对多的关联关系(many-to-many);     一本书只应该由一个出版商出版,所以出版商和书籍是一对多关联关系(one-to-many). 创建一对一的关系:OneToOne("要绑定关系的表名") 创建一对多的关系:ForeignKey("要绑定关系的表名") 创建多对多的关系:ManyToMany("要绑定关系的表名"