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()