添加表记录
一对多:
# 方式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)
返回一个字典,键为聚合值的标识符,可以自由指定,也可以不指定
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号作者"))