添加表记录
一对多:
# 方式1: publish_obj = Publish.objects.get(id=1) Book.objects.create(name='2号图书',price=200,publishs=publish_obj) # 方式2: Book.objects.create(name='3号图书',price=300,publish_id=1)
多对多:
book_obj = Book.objects.filter(name='2号图书').first() author1_obj = Author.objects.get(name='1号作者') author2_obj = Author.objects.get(name='2号作者') book_obj.authors.add(author1_obj,author2_obj)
查询表记录
- 方式1:基于对象
- 方式2:基于双下划线
一对一:
# 反向查询 # 方式1: author_detail_list = AuthorDetail.objects.filter(addr='地址') for obj in author_detail_list: print(obj.author.name) # 方式2: AuthorDetail.objects.filter(author__name='2号作者').values("addr") # 正向查询 # 方式1: Author.objects.filter(name='1号作者').first().authordetail.addr # 方式2: Author.objects.filter(name='1号作者').values("authordetail__addr")
一对多:
# 正向查询(按字段) # 方式1: # 查询1号图书的出版社名字 Book.objects.filter(id=1).first().publishs.name # 方式2: # 查询1号图书的出版社名字和地址 Book.objects.filter(id=1).values_list("publishs__name","publishs__addr") # 反向查询(按表名:表名_set) # 方式1: # 查询1号出版社出版的所有书籍 Publish.objects.get(name='1号出版社').book_set.all() # 方式2: # 查询1号图书的出版社的名字和地址 Publish.objects.filter(book__id = 1).values_list("name","addr")
多对多:
同一对多
聚合查询:
aggregate(*args, **kwargs)
返回一个字典,键为聚合值的标识符,可以自由指定,也可以不指定
扫描二维码关注公众号,回复:
6929997 查看本文章
example:
# 不指定键 Book.objects.all().aggregate(Avg("price")) # 指定键 Book.objects.all().aggregate(price_avg = Avg("price"))
分组查询:
example:
# 单表 # ret = Book.objects.values("price").annotate(Count("id")) # 多表 ret = AuthorDetail.objects.values("addr").annotate(c = Count("author")).values("addr","c") # 多表分组等同于join关联表,再分组查询
F查询:
进行字段值之间的比较,支持对象与常数之间,对象与对象之间的加减乘除和取模运算。
example:
from django.db.models import F # 查询阅读数量大于浏览数量的 Book.objects.filter(readNum__lt=F('scanNum'))
Q查询:
支持与、或、非及其它复杂查询,可以与关键字参数一起使用,但Q对象要放在前面
example:
from django.db.models import Q Book.objects.filter(Q(authors__name="2号作者")|Q(authors__name="1号作者"))