把指定的模型对象添加到关联对象集中。例如:>>> b = Blog.objects.get(id=1)>>> e = Entry.objects.get(id=234)>>> b.entry_set.add(e)# Associates Entry e with Blog b.在上面的例子中,对于ForeignKey关系,e.save()由关联管理器调用,执行更新操作。然而,在多对多关系中使用add()并不会调用任何 save()方法,而是由QuerySet.bulk_create()创建关系。延伸:# 1 *[]的使用>>> book_obj = Book.objects.get(id=1)>>> author_list = Author.objects.filter(id__gt=2)>>> book_obj.authors.add(*author_list)# 2 直接绑定主键book_obj.authors.add(*[1,3])# 将id=1和id=3的作者对象添加到这本书的作者集合中# 应用: 添加或者编辑时,提交作者信息时可以用到.
create(**kwargs)
创建一个新的对象,保存对象,并将它添加到关联对象集之中。返回新创建的对象:>>> b = Blog.objects.get(id=1)>>> e = b.entry_set.create(... headline='Hello',... body_text='Hi',... pub_date=datetime.date(2005, 1, 1)... )# No need to call e.save() at this point -- it's already been saved.这完全等价于(不过更加简洁于):>>> b = Blog.objects.get(id=1)>>> e =Entry(... blog=b,... headline='Hello',... body_text='Hi',... pub_date=datetime.date(2005, 1, 1)... )>>> e.save(force_insert=True)要注意我们并不需要指定模型中用于定义关系的关键词参数。在上面的例子中,我们并没有传入blog参数给create()。Django会明白新的 Entry对象blog 应该添加到b中。
remove(obj1[, obj2, ...])
从关联对象集中移除执行的模型对象:>>> b = Blog.objects.get(id=1)>>> e = Entry.objects.get(id=234)>>> b.entry_set.remove(e)# Disassociates Entry e from Blog b.对于ForeignKey对象,这个方法仅在null=True时存在。
clear()
从关联对象集中移除一切对象。>>> b = Blog.objects.get(id=1)>>> b.entry_set.clear()注意这样不会删除对象 —— 只会删除他们之间的关联。就像 remove() 方法一样,clear()只能在 null=True的ForeignKey上被调用。
# 查询所有住址在北京的作者的姓名authorDetail_list=AuthorDetail.objects.filter(addr="beijing")for obj in authorDetail_list:print(obj.author.name)
多对多查询 (Author 与 Book)
正向查询(按字段:authors):
# 金瓶眉所有作者的名字以及手机号book_obj=Book.objects.filter(title="金瓶眉").first()authors=book_obj.authors.all()for author_obj in authors:print(author_obj.name,author_obj.authorDetail.telephone)
反向查询(按表名:book_set):
# 查询egon出过的所有书籍的名字 author_obj=Author.objects.get(name="egon") book_list=author_obj.book_set.all()#与egon作者相关的所有书籍for book_obj in book_list:print(book_obj.title)
###################################--单表分组查询--#######################################################查询每一个部门名称以及对应的员工数emp:id name age salary dep1 alex 122000 销售部2 egon 223000 人事部3 wen 225000 人事部sql语句:select dep,Count(*)from emp group by dep;ORM:emp.objects.all().values("dep").annotate(Count("id")###################################--多表分组查询--#######################################################多表分组查询:查询每一个部门名称以及对应的员工数emp:id name age salary dep_id1 alex 12200012 egon 22300023 wen 2250002depid name1 销售部2 人事部emp-dep:id name age salary dep_id id name1 alex 12200011 销售部2 egon 22300022 人事部3 wen 22500022 人事部sql语句:select dep.name,Count(*) from emp left join dep on emp.dep_id=dep.id group by emp.dep_idselect dep.name,Count(*) from emp left join dep on emp.dep_id=dep.id group by dep.id,dep.nameORM:dep.objetcs.all().annotate(c=Count("emp")).values("name","c")
bookList=Book.objects.annotate(authorsNum=Count('authors'))for book_obj in bookList:print(book_obj.title,book_obj.authorsNum)
SELECT
"app01_book"."nid",
"app01_book"."title",
"app01_book"."publishDate",
"app01_book"."price",
"app01_book"."pageNum",
"app01_book"."publish_id",
COUNT("app01_book_authors"."author_id") AS "authorsNum"
FROM "app01_book" LEFT OUTER JOIN "app01_book_authors"
ON ("app01_book"."nid" = "app01_book_authors"."book_id")
GROUP BY
"app01_book"."nid",
"app01_book"."title",
"app01_book"."publishDate",
"app01_book"."price",
"app01_book"."pageNum",
"app01_book"."publish_id"
(2) 如果想对所查询对象的关联对象进行聚合:
练习:统计每一个出版社的最便宜的书
publishList=Publish.objects.annotate(MinPrice=Min("book__price"))for publish_obj in publishList:print(publish_obj.name,publish_obj.MinPrice)