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()来获取设置的值

  

猜你喜欢

转载自www.cnblogs.com/yangzhaon/p/11018938.html