F与Q查询
Posted yangzhaon
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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()来获取设置的值
以上是关于F与Q查询的主要内容,如果未能解决你的问题,请参考以下文章