F与Q查询

F查询:

  之前构造的过滤器都是将字段值与某个我们设定的常亮做比较,如果我们要对两个字段的字段的值做比较久需要用到F查询;F查询可以用来比较同一个model事例中两个不同字段的值,

准备工作:

  创建数据库,使用orm创建表,使用Navicat添加数据,也可以使用pycharm中的database功能连接mysql添加数据

from django.test import TestCase

# Create your tests here.
import os
import sys
if __name__ == "__main__":
    os.environ.setdefault("DJANGO_SETTINGS_MODULE", "test01.settings")
    import django
    django.setup()
    from app01 import models

    # 查询卖出数大于50的商品
    # res = models.Product.objects.filter(maichu__gt=50)
    # print(res)

    # 查询卖出数大于库存数的商品,F查询
    from django.db.models import F,Q

    res=models.Product.objects.filter(maichu__gt=F(‘kucun‘))
    print(res)

  

    # 将所有商品的价格提高100块
    res = models.Product.objects.update(price=F(‘price‘)+100)
    print(res)

  

    #将所有的商品的名字后面都加一个爆款
    from django.db.models.functions import Concat
    from django.db.models import Value
    res=models.Product.objects.update(name=Concat(F(‘name‘),Value(‘爆款‘)))
    print(res)

  

Q查询:

  filter() 方法中传入多个值用逗号分开表示的意思的并且的关系,如果需要用到或条件的时候可以用Q查询

  

    #查询卖出数大于300或者价格小于100块的商品
    res=models.Product.objects.filter(Q(maichu__gt=300)|Q(price__lt=100))
    print(res)

  Q查询也可以当做并且条件使用:

  

    res =models.Product.objects.filter(Q(name=‘衣服爆款‘),Q(maichu=1001))
    print(res)# 名字和卖出条件都满足的数据为空,查询出的结果为空

  

    res =models.Product.objects.filter(Q(name=‘衣服爆款‘),Q(maichu=1000))
    print(res)#名字和卖出都满足的的情况下有数据输出

  

  ‘~’:相反意思

    # 价格是100不是衣服爆款的商品
    res =models.Product.objects.filter(Q(price=100.00)|~Q(name=‘衣服爆款‘))
    print(res)

  

事物

  原子性

  一致性

  隔离性

  持久性

  

  开启事务:

  

    #开启事物
    from django.db import transaction
    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)
    print(‘操作完成‘)

  

事物执行成功

查看sql数据是否被修改了

在原有的表格字段上添加新的字段

迁移数据,把新增的字段写入的数据库中

  python3 manage.py makemigrations

  python3 manage.py migrate

查看数据库中新增字段是否添加上:

数据库中限制存数据的值

执行命令:

  python3 manage.py makemigrations

  python3 manage.py migrate

查看数据库是否创建完成:

  

查询数据:

只能查询到数据库中的值,但是查询不到写入的对应的值

通过get_字段名__display()来获取设置的值

  

原文地址:https://www.cnblogs.com/yangzhaon/p/11018938.html

时间: 2024-10-02 20:44:57

F与Q查询的相关文章

django之 F与Q查询

F与Q查询 F查询 why??????? 我们构造的过滤器都只是将字段值与某个我们自己设定的常量做比较.如果我们要对两个字段的值做比较,那该怎么做呢? answer:Django 提供 F() 来做这样的比较.F() 的实例可以在查询中引用字段,来比较同一个 model 实例中两个不同字段的值. show time (我们来演示以下啪)??? 1 from django.db import models 2 3 # Create your models here. 4 5 class Produ

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 [<Prod

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("要绑定关系的表名"

聚合与分组查询,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为查询条件,同其他查询方式的写法

ORM多表分组、F与Q查询

编辑本博客 一.分组查询 先连接表,再分组查询 需求:查询每一个出版社出版的名称以及书籍个数 SQL连接表: SELECT * FROM app_book INNER JOIN app_publish on app_book.publish_id = app_publish.nid ORM连接表: Book.objects.values("publish").values() SQL链表后分组: SELECT count(title),app_publish.name FROM app

68 聚合和分组, F和Q查询, cookie, session

主要内容: 1  聚合和分组: a : 先导入聚合函数: from django.db.models import  Max, Min, Avg, Count, Sum b : 可以为聚合函数设置名字:  max = Max('price') c : 聚合用到了aggregate,  是queryset的一个终止语句,  获取的结果是一个字典的形式. 1 from django.db.models import Avg, Sum, Max, Min, Count 2 ret = models.B

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

F查询和Q查询,摘自李文周老师

F查询和Q查询 F查询 在上面所有的例子中,我们构造的过滤器都只是将字段值与某个常量做比较.如果我们要对两个字段的值做比较,那该怎么做呢? Django 提供 F() 来做这样的比较.F() 的实例可以在查询中引用字段,来比较同一个 model 实例中两个不同字段的值. 示例1: 查询评论数大于收藏数的书籍 from django.db.models import F models.Book.objects.filter(commnet_num__gt=F('keep_num')) Django