クエリ知識の要約にORMクエリ


models.Book.objects.filter(** kwargsから):クエリセット[OBJ1、OBJ2]
models.Book.objects.filter(** kwargsから).values(*引数):クエリセット[{}、{}、{}]
モデル.Book.objects.filter(** kwargsから).values_list(タイトル):クエリセット[()()()]

クロステーブルのクエリの概要:

1、表を作成します

コードをコピー
クラスブック(models.Model):
  タイトル = models.CharField(MAX_LENGTH = 32 

  公開 = models.ForeignKeyを(" 公開"#は、多くの外国のキーフィールドを作成します 
  AuthorList = models.ManyToManyField(" 著者"#の複数の多くの関係は、自動的にテーブルを作成する


クラスをパブリッシュ(models.Model):
  名前 = models.CharField(MAX_LENGTH = 32 
  ADDR = models.CharField(MAX_LENGTH = 32 


クラス著(models.Model):
  名前 = models.CharField( = 32 MAX_LENGTH 
  年齢 = models.IntegerField()

  AD = models.models.OneToOneField(" AuthorDetail "#は1人の関係の1つを作成し

たクラスAuthorDetail(models.Model):
  TEL = models.IntegerField()
コードをコピー

:オブジェクトリレーショナルクエリに基づいて2、

IF対多のクエリ(ブック-公開):
  フィールドによって、フォワード・クエリ:
  book_obj.publish:この本に関連したプレスbook_obj.publish.addrオブジェクトは:本書は、関連付けられています出版社は、アドレス
  テーブル名_setのことで、逆引き参照を
  publish_obj.book_set:[OBJ1、OBJ2、....]:プレスはpublish_obj.book_set.allオブジェクトのこの本のコレクション()に関連付けられた

1つのクエリのIF (著者--- AuthorDetail):
  フィールドによってフォワード・クエリ:
  author_obj.ad:この著者の詳細オブジェクトと著者が関連付けられ

  たテーブル名:逆引き
  author_detail_obj.author:オブジェクトの作成者に関連付けられた詳細オブジェクト

場合を対多(書籍----著):

  フィールドによって前方クエリ:

  book_obj.authorList.all():この本は、すべてのオブジェクトに関連付けられたコレクションです[OBJ1、OBJ2、...]

    book_obj.authorList.all()の値(「名前」 ):. あなたは、単一の値を確認したい場合は、できるときに確認する

  テーブル名_setで、逆引き:
  author_obj.book_set.all():著者は、すべての書籍に関連していますオブジェクトのコレクション

   。Book_obj.book_set.all()の値(「名前」):あなたは、単一の値を確認したい場合は、これをチェックすることができます

お問い合わせのテーブル二重線間低下に基づきます:

多くのクエリ(ブック-公開)の場合:
  フォワード問い合わせ、フィールドによると:

 お問い合わせLinuxの出版社の名前: 
  。Models.Book.objects.all()フィルタを(タイトル= " Linuxの").values(" publish__name "

  逆引き参照:表名:

お問い合わせ人民出版社は、すべての書籍の名前を公表 
  models.Publish.objects.filter(名= 人民出版社).values(book__titleを

もし1つのクエリ(著--- AuthorDetail):
  フォワード問い合わせ、フィールドによると:

#のクエリエゴン・電話番号 
  models.Author.objects.filter(名前= " エゴン").values(" ad__tel "

  逆引き参照:表名:

問い合わせ電話番号が151の著者である 
  models.AuthorDetail.objects.filter(TEL = " 151 ").values(" author__name "

:多くの-IF(書籍----著)
  フィールドによると、フォワード問い合わせ:

#查询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"))

 



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 [(),(),()]

跨表查询总结:

1、创建表

コードをコピー
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()
コードをコピー

2、基于对象关联查询:

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,....]

    book_obj.authorList.all().values("name"): 如果想查单个值的时候可以这样查

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

   book_obj.book_set.all().values("name"): 如果想查单个值的时候可以这样查

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

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

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

  反向查询:按表名:

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

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

#查询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:MIN(価格を)選択からpublish_idで書籍グループ。
ORM:models.Book.objects.values(" publish__name ").annotate(MIN(" 価格"))

 


おすすめ

転載: www.cnblogs.com/maaosheng/p/11621519.html