models.py示例
class Book(models.Model): nid=models.AutoField(primary_key=True) title=models.CharField(max_length=32) # 书籍与出版社: 一对多 publisher=models.ForeignKey(to="Publish",related_name="bookList") # 书籍与作者: 多对多 authors=models.ManyToManyField("Author") class Publish(models.Model): name=models.CharField(max_length=32) class Author(models.Model): name=models.CharField(max_length=32) class AuthorDetail(models.Model): addr=models.CharField(max_length=32) author=models.OneToOneField("Author")
单表查收
models.Book.obejcts.all() # QuerySet [] models.Book.obejcts.filter(nid__gt=1,nid__lt=10) # QuerySet [] models.Book.obejcts.get() # model对象 models.Book.obejcts.values() # QuerySet [{},{}] models.Book.obejcts.values_list() models.Book.obejcts.exclude() models.Book.obejcts.all().first() models.Book.obejcts.all().last() models.Book.obejcts.all().orderby() models.Book.obejcts.all().reverse() models.Book.obejcts.values("price").distinct() #去重不要带索引,索引本身是唯一的 models.Book.obejcts.all().count() models.Book.obejcts.all().exist() ---- 双下划线: models.Book.obejcts.filter(nid__gt=12) models.Book.obejcts.filter(price__in=[112,223,444]) 支持链式操作: models.Book.obejcts.all().filter().orderby("id").count() models.Book.obejcts.all().get().orderby("id").count()
跨表查询
基于对象 类似于SQL语句的子查询
(1) 查询Linux这本书的出版社名称和作者名字 属于正向查询 按关联字段
book_obj=models.Book.obejcts.get(title="linux") book_obj.publisher.name authors_list=book_obj.authors.all() for author in authors_list: print(author.name)
(2) 人民出版社出版过的所有书籍名称 属于反向查询 if 设置related_name,那么related_name的值,没有设置,按表明_set
publish_obj=models.Publish.obejcts.filter(name="人民出版社").first() book_list=publish_obj.bookList.all() for book in book_list: print(book.title)
(3) alex 出版社过得所有书籍的名称 属于反向查询 if 设置related_name,那么related_name的值,没有设置,按表明_set
alex=models.Author.obejcts.get(name="alex") book_list=alex.book_set.all() for book in book_list: print(book.title)
(4) 作者alex的所在地址 正向查询 按字段 反向查询 按表名
alex=models.Author.obejcts.get(name="alex") alex.authordetail.addr
基于QuerySet
双下划线:类似于inner join 正向查询:按字段 反向查询:按表名 key: 1 过滤条件 2 查询结果
(1) 查询Linux这本书的出版社名称和作者名字 属于正向查询 按关联字段
models.Book.obejcts.filter(title="linux").values("publisher__name") # [{"publisher__name":"人民出版社"}] models.Book.obejcts.filter(title="linux").values("authors__name") #
(2) 人民出版社出版过的所有书籍名称
models.Book.obejcts.filter(publisher__name="人民出版社").values("title") models.Publish.obejcts.filter(name="人民出版社").values("book__title")
(3) alex 出版社过得所有书籍的名称
models.Book.obejcts.filter(authors__name="alex").values("title")
models.Author.obejcts.filter(name="alex").values("book__title")