Django中的ORM(物件關係對映)

2021-06-26 13:45:16 字數 2662 閱讀 4938

django與資料庫的命令互動主要是通過manage.py,常用的命令就是manage.py syncdb,可以將model中不在資料庫中存在的表給建立完成,但是只能建立新的資料表或者列,如果model中將某個已經建立的資料表刪除,syncdb是不會進行同步刪除的操作的。

為什麼要使用orm:orm是直接將sql查詢語句封裝為django類,這樣不僅可以方便我們寫**(不用一行一行敲sql命令),提高**的易讀性(從類,類的屬性,屬性的引數就可以知道資料庫裡面有什麼表,表裡面有哪些列,這些列分別又有什麼限制),還可以提高**的安全性(將資料庫具體相關的部分都交給django了,降低了被sql注入的風險)以及可移植性(不論mysql,postgresql程式設計師做的工作都少多了)。

django中的model 有幾個常用的屬性:

1.charfield 和textfield 都是比較常用的屬性;charfiled 是定長的,而textfield是可以無限長的。

2.除了兩個常用的屬性,還有一些加了驗證的field,比如說:emailfiled,urlfiled和ipadressfield;

他們分別可以進行驗證使用者傳入的值是否是有效的email位址,url和ip位址。

3.booleanfield和nullbooleanfield都是可以儲存true和false的;但是前者不可以是空和null,後者可以。

4.filefield和filepathfield用來儲存使用者上傳的檔案的路徑;

5.django 會自動為你生成乙個名稱為id的主鍵,如果想要自己定義可以通過autofield屬性;如果希望某個屬性成為主鍵可以在屬性後面加上 primary_key = true;而定義unique=true則可以保證變數值的唯一性;

模型與模型(表與表)之間的關係:

主要有兩種:

1.多對一。

舉例:class author(models.model):

name = charfield(length=10)

class book(models.model):

title = charfield(max_length=10)

author = foreignkey(author)

這樣的話每乙個book物件都會有乙個foreignkey,也就是author.在業務上的意義就是每一本書都可以對應乙個作者,並且不同的書可以對應乙個作者,但是這樣有乙個缺陷就是,如果一本書有多個作者,這個關係模型就無法表示了。這樣的話就要用到下面的多對多的關係了。

2.多對多。

class author(models.model):

name = charfield(max_length=10)

class book(models.model):

title = charfield(max_length=10)

author = manytomanyfield(author)

關聯式資料庫本身沒多多對多的關係,django是在資料庫中新建了一張表專門用來儲存多對多的關係。

ps:記得引用的foreignkey和manytomanyfield一定要在author的後面,如果不在後面要將引數寫成字串形式('author')。並且foreignkey和manytomanyfield這段關係在兩個類裡面都可以宣告,作用是一樣的,django會自動為我們把另外一半關係給對稱過去。

model 類的繼承

共有兩種不同的繼承方式:

1.抽象基礎類

具體表現就是不會建立實際的基類資料表,只會建立子類的資料表;

class meta:

abstract = true

2.多表繼承

具體表現就是每乙個類包括父類和子類都會建立一張資料表;

上面講的主要是model中資料庫表的建立,下面開始查詢的部分:

主要使用的是相似的兩個類:manager和queryset

1.除了有特別的指定,managerl類會預設附著在每乙個model類裡面,所以預設情況下每個模型類都會有乙個objects屬性,他構成了這個model在資料庫中的所有查詢;

2.幾個常見的查詢方法:

all:返回乙個模型中所有資料庫記錄的queryset;

filter: 返回乙個包含指定條件的模型記錄的queryset;

exclude: 和filter 正好相反;

get: 獲取單個符合條件的記錄,(沒找到或者超出乙個的記錄都會返回異常;)

(queryset即為:資料庫每一行記錄的列表;使用queryset查詢的資料都是快取在記憶體中的);

books = books.objects.filter(title_contains="tree")相當於:

select * from books where title like *%tree%*

everone = person.objects.all()相當於:

select * from person

overdue_books = book_queryset.filter(due_date__lt=today);

queryset中有,而manager物件中沒有的方法:

對查詢的結果排序:

all_sorted_first = person.objects.all().order_by('first_name');

其他改變查詢的方法:

person.objects.values('first')返回乙個包含所有first name名字的字典;

django之ORM物件關係對映

orm 物件關係對映,物件關係對映的意思就是在python中 類對應資料庫中的 物件對應 中的記錄。屬性對應 中的字段。orm通過讓我們程式設計師使用物件導向的思想來運算元據庫,不用直接再編寫sql語句。提高開發效率。資料建模 簡單地說就是使用資料庫來描述我們的業務邏輯。teacher表 name ...

Django中ORM建立表關係

一 django中orm建立表關係 1.表與表之間的關係 1.表與表之間的關係 一對多一對一 多對多2.操作目標條件 圖書表出版社表 作者表作者詳情表 3.外來鍵關聯 一對多 圖書和出版社是一對多的關係 外來鍵字段建在多的那一方 book 多對多 圖書和作者是多對多的關係 需要建立第三張表來專門儲存...

django 模型之 ORM 物件關係對映(一)

所謂物件關係對映,就是將資料庫的一些名字與python中的一些名字相對應,表名 類名,欄位 屬性,操作 增刪改查 方法。這樣,我們就可以通過對python 的編輯來對資料庫進行操作。流程 建立models,通過models建立遷移檔案 makemigrations 通過遷移檔案對映到資料庫中。boo...