在使用Python的Django框架進(jìn)行web開(kāi)發(fā)的時(shí)候,會(huì)有很多數(shù)據(jù)庫(kù)方面的寫(xiě)入,查詢等操作,在操作數(shù)據(jù)庫(kù)的時(shí)候,我們可以通過(guò)編輯SQL語(yǔ)句進(jìn)行查詢數(shù)據(jù)庫(kù),也可以使用Django ORM(Object-Relational Mapping,對(duì)象關(guān)系映射)來(lái)進(jìn)行數(shù)據(jù)庫(kù)操作,Django ORM 是一個(gè)使用 Python 語(yǔ)言編寫(xiě)的庫(kù),可以使得開(kāi)發(fā)者通過(guò)面向?qū)ο蟮姆绞讲僮麝P(guān)系型數(shù)據(jù)庫(kù)。
使用Django ORM相對(duì)寫(xiě)sql語(yǔ)句執(zhí)行數(shù)據(jù)庫(kù)操作,最大的優(yōu)點(diǎn)就是不用寫(xiě)很長(zhǎng)的代碼,只需要調(diào)用對(duì)象就可以對(duì)數(shù)據(jù)庫(kù)進(jìn)行查詢等操作,但是相對(duì)于寫(xiě)SQL語(yǔ)句,對(duì)于剛開(kāi)始使用Django ORM的人來(lái)說(shuō),可能很多地方用的不是很明白使用起來(lái)就會(huì)生澀很多。
假設(shè)你有兩個(gè)表,一個(gè)是 orders 表,另一個(gè)是 order_details 表,order_details 表包含一個(gè) order_id 字段,與 orders 表中的 id 字段關(guān)聯(lián)。你可以使用 Django 的 ForeignKey 字段來(lái)定義這個(gè)關(guān)聯(lián)。如果你想在 Django 中查詢一個(gè)表,并且想顯示該表中關(guān)聯(lián)的附加表的內(nèi)容,可以使用 Django 的關(guān)聯(lián)表功能。
正常的查詢語(yǔ)句是這樣的:
orders.objects.get(id=1)
但是這樣的查詢結(jié)果,只有主表orders中的字段沒(méi)有附表中的字段,但是我們又需要附表中的信息應(yīng)該怎么辦呢,不熟悉的就只能用本方法,在通過(guò)id去查詢附表
orders_details.objects.get(id=1)
這樣的查詢就會(huì)進(jìn)行兩次查詢,代碼量也增加了,并沒(méi)有達(dá)到預(yù)想中的效果,這個(gè)時(shí)候我們應(yīng)該如何查詢附表中的內(nèi)容呢?
其實(shí)我們可以直接用關(guān)聯(lián)的外鍵就可以將附表中的信息獲取過(guò)來(lái),可以通過(guò)values方法
orders.objects.get(id=1).values('order_id__names')
獲取到得結(jié)果中就會(huì)有附表中的信息,但是字段的名稱成了order_id_names,不太美觀,有強(qiáng)迫癥的表示受不了
這個(gè)時(shí)候我們可以通過(guò)另外的方法,在獲取到附表字段的同時(shí),對(duì)字段名重命名
orders.objects.annotate(details_name=F('receive_uid__name')).get(id=1)
這樣就可以在查詢列結(jié)果里查詢到附表的name,并且鍵名為details_name看起來(lái)更順眼了
下面是我們項(xiàng)目中的一些代碼段可以用來(lái)借鑒