zoukankan      html  css  js  c++  java
  • Django的orm操作之表查询二

    复习

    单表查询

    # 单表操作
    # 增
    # 方式1
    user_obj=models.User.objects.create(**kwargs)  # 之一create
    # 方式2
    user_obj=models.User(**kwargs)
    user_obj.save()
    
    # 查
    user_queryset=models.User.objects.filter(**kwargs)  # 多个过滤条件是and关系
    user_obj=models.User.objects.get()  # 不推荐使用
    users_queryset=models.User.objects.all()  # 惰性查询
    
    # 改
    user_queryset=models.User.objects.filter(**kwargs).update(**kwargs)  # 批量更新
    user_obj=models.User.objects.filter(**kwargs).first()
    user_obj.name='json'
    user_obj.save()
    user_obj.update()  # 对象没有update方法
    
    # 删
    models.User.objects.filter(**kwargs).delete()  # 批量删除
    user_obj=models.User.objects.filter(**kwargs).first()
    user_obj.delete()
    

    多表查询

    表关系:
    • ​ 一对一(OneToOneField)

    • ​ 一对多(ForeignKey)

    • ​ 多对多(ManyToManyField)

    外键字段的增删改查

    # 一对多字段的增删改查(publish)
    # 增
    models.Book.objects.create(publish_id=1)
    
    publish_obj=models.Pulish.objects.filter(pk=1).first()
    models.Book.objects.create(publish=publish_obj)
    
    # 改
    book_obj=models.Book.objects.filter(pk=1).first()
    book_obj.publish=new_publish_obj
    
    book_obj=models.Book.objects.filter(pk=1).update(publish_id=2)
    book_obj=models.Book.objects.filter(pk=1).update(publish=publish_obj)
    
    # 删
    # 删除出版社会级联删除该出版社对应的所有的数据
    
    
    # 多对多字段增删改查
    # 增
    add()
    # 查
    
    # 改
    set() :必须接收一个可迭代对象
    # 删
    remove()
    
    # 上面是三个都支持多个数字或对象
        清空:clear()
    

    跨表查询

    # 正向:关联字段在你当前这张表,查询另一张表
    # 反向: 关联字段不在你这张表,查询另一张表
    # 正反向总结: 正向查询按字段,反向查询按表名小写(********)
    
    # 基于对象的跨表查询(子查询)
    	# 正向
        models.Book.objects.filter(pk=1).first()
        book_obj.publish.addr # (book_obj.publish--->拿到出版社对象)
        book_obj.author  # app01.Auhor.None
        book_obj.author.all()  #
        # 反向
        publish_obj=models.Publish.objects.filter(pk=1).first()
        publish_obj.book_set.all()  # 查询单个数据直接拿,多个数据加个all
    
    # 基于双下划线的跨表查询(联表查询)
    	res=models.Book.objects.filter(publish__name='东方出版社',title='瓶梅').values('title','publish__name','author__authordetail__phone')
    

    queryset对象.query 可以查看内部对象的sql语句

    all()

    filter()

    values()

    value_list()

    order_by()

    reverse()

    distinct()

    exclude()

    count() 计数

    exist() 布尔值

    get() 数据对象本身

    first() 返回数据对象本身

    last() 返回数据对象本身

    聚合函数

    from django.db.models import Max,Min,Sum,Count,Avg
    # 聚合查询
    aggragate()
    
    # 分组查询(group by)
    annotate()  group_concat()  concat()
    
    

    F&Q查询

    # 过滤的条件语句,是另外一个条件过滤出来的数据
    # 卖出大于库存
    
    # F查询
    from djamgo.db.models import F,Q
    
    res=models.Product.objects.filter(maichu__gt=F('kucun'))
    print(res)
    
    
    # 将所有商品的价格提高100块
    models.Product.objects.update(price=F('price')+100)
    
    
    # 将所有商品的名字后面都加一个‘爆款’
    from django.db.models.functions import Concat
    from django.db.models import Value
    models.Product.objects.update(name=Concat(F('name'),Value('爆款')))
    
    
    # Q查询
    from djamgo.db.models import Q
    res=models.Product.objects.filter(Q(price=188.88,Q(name='连衣裙爆款')) # and
    res=models.Product.objects.filter(Q(price=188.88)|Q(name='连衣裙爆款')) # | or 
    res=models.Product.objects.filter(Q(price=188.88)|~Q(name='连衣裙爆款')) # | not
                                      
                                      
    # Q对象的另外一种用法
    form django.db.models import F,Q
     res=models.Product.objects.filter(Q(price=188.88)|Q(name='连衣裙爆款')) # | or 
                                      
    
    from django.test import TestCase
    
    # Create your tests here.
    import os
    import sys
    
    if __name__ == "__main__":
        os.environ.setdefault("DJANGO_SETTINGS_MODULE", "day58.settings")
        import django
        
        django.setup()
        from app01 import models
        
        # 查询卖出数量大于1000的商品
        res = models.Product.objects.filter(salary_count__gt=1000).values('name', 'salary_count')
        print(res)
        
        # 查询卖出数量大于库存数量的商品信息
        from django.db.models import F, Q
        
        res = models.Product.objects.filter(salary_count__gt=F('inventory_count')).values('salary_count', 'inventory_count')
        print(res)
        # 查询卖出数量小于等于库存数量的商品的销售数量和商品库存
        res = models.Product.objects.filter(salary_count__lte=F('inventory_count')).values('salary_count',
                                                                                           'inventory_count')
        print(res)
        
        # 将所有的商品的价格提高100块
        res = models.Product.objects.update(price=F('price') + 100)  # res 是受影响的行数
        print(res)
        
        # 将所有商品的名字后面都加一个爆款
        # 对于字符串的拼接 还需要导入两个模块
        from django.db.models.functions import Concat
        from django.db.models import Value
        
        # models.Product.objects.update(name=Concat(F('name'), Value('1')))
        
        # Q查询
        # Q(filter里面条件都是与,Q支持与或非)
        # 1.查询 卖出数大于100 或者 价格小于100块的
        res = models.Product.objects.filter(Q(salary_count__gt=1000) | Q(price__lt=6000))  # or
        print('Q1', res)
        # 2.查询 库存数是100 并且 卖出数不是0 的产品
        res = models.Product.objects.filter(Q(inventory_count__gt=900), Q(salary_count__gt=1000))  # and
        print(res)
        # 3.查询 产品名包含新款, 并且库存数大于60的
        res = models.Product.objects.filter(Q(name__contains='ipho'), ~Q(inventory_count=1000))  # and
        print(res)
        
         # Q对象补充(******)
        from django.db.models import F, Q
        q = Q()
        q.connector = 'or'  # 通过这个参数可以将Q对象默认的and关系变成or
        q.children.append(('price',188.88))
        q.children.append(('name','高跟鞋爆款'))
        res = models.Product.objects.filter(q)  # Q对象查询默认也是and
        print(res)
    
        # 事务
        from django.db import transaction
        
        try:
            # 开启事务
            with transaction.atomic():
                # 商品销售数量+1
                models.Product.objects.filter(id=1).update(salary_count=F('salary_count') + 1)
                # 商品库存数量减1
                models.Product.objects.filter(id=1).update(inventory_count=F('inventory_count') - 1)
        except Exception as e:
            print(e)
    
    
  • 相关阅读:
    161028、Nginx负载均衡实现tomcat集群方案简要小结
    161027、Java 中的 12 大要素及其他因素
    161026、更快速将你的页面展示给用户[前端优化篇]
    161025、java提高篇之关键字static
    161024、并发控制中的乐观锁与悲观锁
    161021、spring异步调用,完美解决!
    161020、web调试工具fiddler介绍及使用
    RuntimeError: cryptography requires setuptools 18.5 or newer, please upgrade to a newer version of setuptool
    PyCharm IDE环境下,执行unittest不生成测试报告问题解决
    (转)selenium使用Xpath+CSS+JavaScript+jQuery的定位方法(治疗selenium各种定位不到,点击不了的并发症)
  • 原文地址:https://www.cnblogs.com/qianzhengkai/p/11020258.html
Copyright © 2011-2022 走看看