ORM 关键

    1. 老师的增删改查
        1. teacher_obj.cid.add(*[1, 2, 3])   添加(必须打散)
        2. teacher_obj.cid.set([1, 2, 3])    设置(不用打散)
        
    2. 查询练习
        1. 单表查询  只在一张表里查各种字段
            obj.属性(字段)
        2. 一对多(外键)和一对一
            正向:
                从写外键或一对一的表开始查 叫 正向查
                obj.外键(一对一).属性
            反向查:
                1. 一对多
                    obj.表名_set
                2. 一对一
                    obj.表名        
        3. 多对多
        
            正向查:
                从写多对多的表开始查 叫 正向查
                obj.多对多字段名.all() --> QuerySet()
            反向查:
                obj.表名_set.all()     --> QuerySet()
                        
        4. 双下划线 表示跨表查询
            正向:
                1. 关联的字段名__另外一张表的字段名
            反向:
                1. 另外一张表的表名__另外一张表的字段名
                
        5. 聚合
            aggregate()
            
            from django.db.models import Avg, Max, Min, Count, Sum
            
            # 求最贵的那本书
            models.Book.objects.all().aggregate(max_price=Max("price"))
        
        6. 分组
        annotate()
        
            # 将所有的书按作者分组,统计每个作者最贵的书
            models.Author.objects.all().annotate(author_max=Max("books__price"))
            最后得到的是一个QuerySet()对象,里面的每个数据对象都多了一个author_max字段
        
        7. F 
            查询条件是字段间的比较
            
            查询所有购买数大于收藏数的商品
            models.Goods.objects.filter(buy_num__gt=F("keep_num"))
            
            扩展的两个:
                1. 将每个商品的购买数+1000
                    models.Goods.objects.all().update(buy_num=F("buy_num")+1000)
                2. 将所有商品的名字前面加上 “特价”
                    from django.db.models.functions import Concat
                    from django.db.models import Value
                    
                    models.Goods.objects.filter().update(name=Concat(Value("特价"), F("name")))
                    
        8. Q
            相当于取出子集和
            
            Q(条件1) | Q(条件2)
            Q(条件1) & Q(条件2)
            Q(条件1) & ~Q(条件2)    
            
            当Q查询和关键字查询都有的时候,Q查询要写在前面
            models.Book.objects.filter(Q(title__contains="物语")|Q(publish_day__year=2017),price__lt=9)
                
        
        9. 常用字段
            
        10. 字段参数
            null
            max_length
            default
            unique
            primary_key
            
            时间字段相关:
                auto_now_add  创建这条数据时自动加当前时间
                auto_now      每一次修改都更新时间
            
            关系字段:
                related_name
                to
                to_field
        
        11. 所有QuerySet方法
            
            1. select_realated(关系字段) 
                一对一或多对一查询时用这个
            
            2. prefetch_realated()
                多对多和一对多时用这个

            3. 批量创建
            
                提前把数据对象生成,
                data = [obj1, obj2, obj3]
                bulk_create(data, 10)
            4. 执行额外SQL语句
                Entry.objects.extra(select={'new_id': "select col from sometable where othercol > %s"}, select_params=(1,))
                
            5. 直接执行原生SQL(和pymysql类似)
                拿到连接,获取光标,执行SQL语句
                from django.db import connection, connections
                cursor = connection.cursor()  # cursor = connections['default'].cursor()
                cursor.execute("""SELECT * from auth_user where id = %s""", [1])
                row = cursor.fetchone()
原文地址:https://www.cnblogs.com/jassin-du/p/8352851.html