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