ORM多表操作 之 基於雙下劃線的跨表查詢

2021-09-11 11:32:42 字數 4131 閱讀 4347

目錄

1.基於雙下劃線

2.模型介紹

3.模型建立

4.新增資料

5.例項演示

一對多多對多

一對一高階練習

基於雙下劃線的跨表查詢也就是sql中的join(連表)查詢

django 提供了一種直觀而高效的方式在查詢(lookups)中表示關聯關係,它能自動確認 sql join 聯絡。要做跨關係查詢,就使用兩個下劃線來鏈結模型(model)間關聯欄位的名稱,直到最終鏈結到你想要的model 為止。

定義模型:作者詳細:nid、birthday、telephone、addr

出版社:nid、name、city、email

書籍:nid、title、publishdate、price

模型之間的關係:

1.作者和作者詳細是一對一的關係

2.作者和書籍是多對多的關係

3.書籍和出版社是多對一的關係

建立模型語句:

from django.db import models

# create your models here.

class author(models.model):

nid = models.autofield(primary_key=true)

name=models.charfield( max_length=32)

age=models.integerfield()

# 與authordetail建立一對一的關係

authordetail=models.onetoonefield(to="authordetail",on_delete=models.cascade)

class authordetail(models.model):

nid = models.autofield(primary_key=true)

birthday=models.datefield()

telephone=models.bigintegerfield()

addr=models.charfield( max_length=64)

class publish(models.model):

nid = models.autofield(primary_key=true)

name=models.charfield( max_length=32)

city=models.charfield( max_length=32)

email=models.emailfield()

class book(models.model):

nid = models.autofield(primary_key=true)

title = models.charfield( max_length=32)

publishdate=models.datefield()

price=models.decimalfield(max_digits=5,decimal_places=2)

# 與publish建立一對多的關係,外來鍵字段建立在多的一方

publish=models.foreignkey(to="publish",to_field="nid",on_delete=models.cascade)

# 與author表建立多對多的關係,manytomanyfield可以建在兩個模型中的任意乙個,自動建立第三張表

authors=models.manytomanyfield(to='author',)

author表:

authordetail表:

book表:

publish表:

正向查詢是指:a,b兩個表的關聯字段在a表中,由a查b是正向。

反向查詢是指:a,b兩個表的關聯字段在a表中,由b查a是反向。

# 正向查詢按欄位:按 關聯字段

#反向查詢:按 表名(小寫)

# 查詢蘋果出版社出版過的所有書籍的名字與**(一對多)

# 正向查詢 按欄位:publish

ret = models.book.objects.filter(publish__name="蘋果出版社").values("title", "price")

print(ret)

列印:# 反向查詢 按表名:book

ret = models.publish.objects.filter(name="蘋果出版社").values("book__title", "book__price")

print(ret)

列印:

# 查詢zhou出過的所有書籍的名字(多對多)

# 正向查詢 按欄位:authors:

ret = models.book.objects.filter(authors__name="zhou").values("title")

print(ret)

列印:# 反向查詢 按表:book(小寫)

ret = models.author.objects.filter(name="zhou").values("book__title")

print(ret)

列印:

# 查詢zhou的手機號

# 正向查詢

ret = models.author.objects.filter(name="zhou").values("authordetail__telephone")

print(ret)

列印:# 反向查詢

ret = models.authordetail.objects.filter(author__name="zhou").values("telephone")

print(ret)

列印:

# 練習: 查詢蘋果出版社出版過的所有書籍的名字以及作者的姓名

ret = models.publish.objects.filter(name="蘋果出版社").values("book__title", "book__authors__name")

print(ret)

列印:ret = models.book.objects.filter(publish__name="蘋果出版社").values("title", "authors__name")

print(ret)

列印:# 練習: 手機號以150開頭的作者出版過的所有書籍名稱以及出版社名稱

ret = models.author.objects.filter(authordetail__telephone__startswith="150").values("book__title", "book__publish__name")

print(ret)

列印:ret = models.book.objects.filter(authors__authordetail__telephone__startswith="150").values("title", "publish__name")

print(ret)

列印:

Django之ORM雙下劃線查詢

下面只列舉常用的一些 查詢user表中age大於30的 models.user.objects.filter age gt 30 查詢user表中age小於30的 models.user.objects.filter age lt 30 查詢user表中age大於等於30的 models.user....

python的單下劃線和雙下劃線

python 類中的單下劃線開頭的變數表示 該方法為類的私有方法,原則上外部不能訪問,但是用.xx是可以訪問到的 雙下劃線開頭則是強制外部不能直接訪問的用.xx是訪問不到的,它內部其實是將變數名重新命名為 類名 變數名,所以可以通過.類名 變數名訪問 coding utf 8 author linh...

Python 單下劃線與雙下劃線的區別

python 用下劃線作為變數字首和字尾指定特殊變數。不能用 from moduleimport 匯入 系統定義名字 類中的私有變數名 核心風格 避免用下劃線作為變數名的開始。因為下劃線對直譯器有特殊的意義,而且是內建識別符號所使用的符號,我們建議程式設計師避免用下劃線作為變數名的開始。一般來講,變...