目錄
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表:正向查詢是指:a,b兩個表的關聯字段在a表中,由a查b是正向。authordetail表:
book表:
publish表:
反向查詢是指: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 匯入 系統定義名字 類中的私有變數名 核心風格 避免用下劃線作為變數名的開始。因為下劃線對直譯器有特殊的意義,而且是內建識別符號所使用的符號,我們建議程式設計師避免用下劃線作為變數名的開始。一般來講,變...