ORM
1 添加方法
表.objects.create()
obj=类(title="")
obj.save()
外键字段添加方式(一对多)
Book.objects.create(title="",price="",publish_id=) # publish_id对应的Publish表中的主键id
Book.objects.create(title="",price="",publish=pub_obj) # publish_id对应的Publish表中的主键id
book_obj.publish : 与这本书相关联的出版社对象(一个)
外键字段添加方式(多对多)
authors=models.ManyToManyFields("Author")
book_obj.authors : 与这本书相关的所有的作者集合(querySet)
book_obj.authors.add(obj1,obj2)
book_obj.authors.add(*[])
book_obj.authors.remove(obj)
book_obj.authors.clear()
2 查询方法
表.objects.all() -----------QuerySet [obj,obj]
表.objects.filter(id__gt=3,id__lt=6) -----------QuerySet [obj,obj]
表.objects.get() -----------model对象
QuerSet.first() -----------model对象
QuerSet.last() -----------model对象 eg: 表.objects.all().first()
表.objects.values(字段) --------- 存放字典的集合对象
<QuerySet [{'price': Decimal('45.00'), 'title': 'linux'}, {'price': Decimal('100.00'), 'title': '老男孩历险记'}, {'price': Decimal('12.00'), 'title': '老男孩感情史'}]>
QuerySet:
1 可切片
2 可迭代
3 惰性机制
iterator
exits
连表查询
class Book_authors():
book_id=...
author_id=....
class Author():
name=.....
#books=models.ManyToManyFields("Book")
class Publish():
name=....
class BOOK():
title=...
publish=...
authors=.....
1 基于对象
正向查询:
# 查询某本书的出版社或者作者信息
book_obj=BOOK.objects.get(id=4)
book_obj.publish # 与这本书相关联的出版社
book_obj.authors # 与这本书关联的作者对象集合
反向查询:
# 查询某个出版社出版过的书
# 查询某个作者出版社过的书
author_obj=Author.objects.get(id=2)
author_obj.关联表名__set
author_obj.book__set # 与这个作者关联的所有书籍对象的集合
2 基于 filter values __
表.objects.filter().values()
# 查询python这本书的出版社名字
BOOK.objects.filter(title="python").values(publish__name)
Publish.objects.filter(book__title="python").values("name")
聚合与分组
在sql:
select max() group by 字段 having
select Avg(score) from stu
aggreagte:
Book.objects.all().aggregate(AvgPrice=Avg("price"))
annotate:
# 每一个作者出版过的书中的最高价 : 按作者名字分组
ret4=Book.objects.values("authors__name").annotate(Max("price"))
print(ret4)
F Q
F:
Book.objects.all().update(price=F("price")+20)
Q:
Book.objects.filter(Q(price__gt=200) | Q(id__gt=5) ,title__startswith="老")
3 修改方法
Book.objects.filter(id=5).update(price=1000)
4 删除
Book.objects.filter(id=5).delete() # 级联删除