Django ORM 一對多操作

2022-09-11 14:33:34 字數 2478 閱讀 3152

#

models.py

form django.db

import

models

class book(models.model):  #

表名book,django會自動使用專案名+我們定義的表名

#如沒有自定義主鍵,django會自動新增乙個主鍵,欄位名id 自增

name = models.charfield(max_length=20)  #

欄位名name 型別 vachar(20)

price = models.integerfield()   #

欄位名price 型別int

pub_date = models.datefield()   #

欄位名pub_date 型別 date (時間戳)

publish = models.foreighkey('publish',related_name='***')  # 建立外來鍵關聯到publish表的id欄位,django會自動將該名稱改為publish_id  這裡的publish可以代指publish中的一行資料(name city),即publish的乙個例項物件

# related_name='***' 表示能過publish來找book時使用的名稱,預設為book_set(反向查詢時使用)

# 如果這樣寫 publish = models.foreighkey(publish) 括號內無引號,則必須將publish類放到book類的上面

def__str__

(self):

return self.name  #

列印例項物件時顯示為self.name

class publish(models.model):

name = models.charfield(max_length=32)

city = models.charfield(max_length=32)

#

views.py

from django.shortcuts import

render

匯入models.py

def add(request):  #

增加資料的檢視函式

# 方式一 直接對publish_id賦值

book.objects.create(name='

linux基礎

',price=99,author='

yuan

',pub_date='

2017-12-12

',publish_id=2

)  # 一次資料庫操作,推薦

# 方式二 通過建立乙個publish的物件直接對publish賦值

publish_obj = publish.objects.filter(name='人民出版社')[0]  # ==>publish_obj = publish.objects.filter(name='人民出版社').first()

book.objects.create(name='linux基礎',price=99,author='yuan',pub_date='2017-12-12',publish=publish_obj)  # 兩次資料庫操作
return httpresponse('

新增成功')

得出結論:1.publish_id 對應乙個數字

2.publish對應乙個publish的例項物件

# 通過雙下劃線查詢 (可以用在filter與values中)

1.獲取所有人民出版社的書

book.objects.filter(publish__name='人民出版社')

publish.objects.filter(name='人民出版社').values('book__name')

2.獲取python這本書出版社的名字

publish.objects.filter(book__name='python')

book.objects.filter(name='python').values('publish__name')

3.獲取所有北京的出版社出過所有的書

book.objects.filter(publish__city='北京')

publish.objects.filter(city='北京').values('book__name')

注意:1、使用filter與values時,如果要取publish中的內容,可使用雙下劃線進行跨表 如publish__name

2、使用for 遍歷由filter或all得出的queryset時。使用點進行跨表,因為publish相當於乙個物件,則使用publish.name

3、使用for 遍歷由values得出的queryset時,因為queryset中是乙個乙個字典,使用下標進行取值 如 row['name']

3、在模板中只能使用點

Django ORM 一對多 和 多對多

在 models.py 上定義 class province models.model name models.charfield max length 32 def str self return self.name class city models.model name models.char...

Django ORM 一對多表的建立

前面已經學習了在django裡面,如何對單錶進行增刪改查詢。下面學習一下如果存在外來鍵約束的情況下,如何建立。例1models.py from django.db import models class usergroup models.model uid models.autofield prim...

mysql join 一對多 Join 一對多連線

資料庫常見的join方式有三種 inner join,left outter join,right outter join 還有一種full join,因不常用,本文不討論 這三種連線方式都是將兩個以上的表通過on條件語句,拼成乙個大表。以下是它們的共同點 1.關於左右表的概念。左表指的是在sql語...