关于查询知识点总结

级联删除:   on_delete = modle.CASCADEpython

 

 

models.Book.objects.filter(**kwargs): querySet [obj1,obj2]
models.Book.objects.filter(**kwargs).values(*args) : querySet [{},{},{}]
models.Book.objects.filter(**kwargs).values_list(title) : querySet [(),(),()]linux

 

跨表查询总结:

一、建立表sql

class Book(models.Model):
  title = models.CharField(max_length=32)

  publish=models.ForeignKey("Publish") # 建立一对多的外键字段
  authorList=models.ManyToManyField("Author") # 多对多的关系,自动建立关系表


class Publish(models.Model):
  name = models.CharField(max_length=32)
  addr = models.CharField(max_length=32)


class Author(models.Model):
  name=models.CharField(max_length=32)
  age=models.IntegerField()

  ad=models.models.OneToOneField("AuthorDetail") #建立一对一的关系

class AuthorDetail(models.Model):
  tel=models.IntegerField()

二、基于对象关联查询: 

if 一对多查询(Book--Publish):
  正向查询,按字段:
  book_obj.publish : 与这本书关联的出版社对象 book_obj.publish.addr: 与这本书关联的出版社的地址
  反向查询,按表名_set
  publish_obj.book_set: 与这个出版社关联的书籍对象集合 publish_obj.book_set.all() :[obj1,obj2,....]

if 一对一查询(Author---AuthorDetail):
  正向查询,按字段:
  author_obj.ad : 与这个做者关联的做者详细信息对象

  反向查询:按表名:
  author_detail_obj.author : 与这个做者详细对象关联的做者对象

if 多对多(Book----Author):函数

  正向查询,按字段: 

  book_obj.authorList.all(): 与这本书关联的全部这做者对象的集合 [obj1,obj2,....]spa

    book_obj.authorList.all().values("name"): 若是想查单个值的时候能够这样查

  反向查询,按表名_set:
  author_obj.book_set.all() : 与这个做者关联的全部书籍对象的集合code

   book_obj.book_set.all().values("name"): 若是想查单个值的时候能够这样查对象

 

基于双下滑线的跨表查询:

f 一对多查询(Book--Publish):
  正向查询,按字段:blog

# 查询linux这本书的出版社的名字:
  models.Book.objects.all().filter(title="linux").values("publish__name")

反向查询:按表名:it

# 查询人民出版社出版过的全部书籍的名字
  models.Publish.objects.filter(name="人民出版社出版").values("book__title")

if 一对一查询(Author---AuthorDetail):
  正向查询,按字段:class

#查询egon的手机号
  models.Author.objects.filter(name="egon").values("ad__tel")

反向查询:按表名:

#查询手机号是151的做者
  models.AuthorDetail.objects.filter(tel="151").values("author__name")

if 多对多(Book----Author):

  正向查询,按字段:

#查询python这本书的做者的名字
  models.Book.objects.filter(title="python").values("authorList__name") [{},{},{},{}]

正向查询,按表名:

#查询alex出版过的出的价格
models.Author.objects.filter(name="alex").values("book__price")

注意:

publish=models.ForeignKey("Publish",related_name="bookList")
authorlist=models.ManyToManyField("Author",related_name="bookList") 
ad=models.models.OneToOneField("AuthorDetail",related_name="authorInfo")
反向查询的时候都用:related_name的值

聚合查询:

querySet().aggregate(聚合函数)------返回的是一个字典,再也不是一个querySet
Book.objects.all().aggregate(average_price=Avg('price'))

分组查询:
querySet().annotate() --- 返回的是querySet

#统计每个出版社中最便宜的书籍的价格

sql:   select Min(price) from book group by publish_id;
ORM:  models.Book.objects.values("publish__name").annotate(Min("price"))
相关文章
相关标签/搜索