中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

怎么理解Django ORM操作

發布時間:2021-10-21 09:41:27 來源:億速云 閱讀:124 作者:iii 欄目:web開發

本篇內容主要講解“怎么理解Django ORM操作”,感興趣的朋友不妨來看看。本文介紹的方法操作簡單快捷,實用性強。下面就讓小編來帶大家學習“怎么理解Django ORM操作”吧!

表結構設計

還是從實際角度出發。

假設,現在我需要設計一個簡單的圖書管理系統,是那種買的書,不是圖書館的書!!!

我想了想,首先,肯定有一個圖書表,專門存放圖書的信息,最起碼是這樣的。

怎么理解Django ORM操作

但是又想了想,似乎我的書想發布,肯定是需要一個出版社幫我發布的,我肯定不能自己發布所以是這樣子的。

怎么理解Django ORM操作

又想了想,書肯定是人寫的,肯定要有作者,所以還需要一個作者表,應該是這樣子的。

怎么理解Django ORM操作

又想了想,這一本書如果讓一般人編,難度有點大啊,一般都是多人一起完成的,所以大概還有這樣一張表。

怎么理解Django ORM操作

其實,上述漏點了一個東西,圖書需要歸屬一個出版社的,所以,最終表結構應該是這樣的!

怎么理解Django ORM操作

Django models代碼

from django.db import models   # 作者表 class Author(models.Model):     name = models.CharField(verbose_name="作者姓名", max_length=8)     age = models.IntegerField(verbose_name="作者年齡")     phone = models.CharField(verbose_name="作者聯系方式", max_length=11)   # 出版社 class Publish(models.Model):     title = models.CharField(verbose_name="出版社名稱", max_length=16)     phone = models.CharField(verbose_name="出版聯系方式", max_length=11)   # 圖書 class Book(models.Model):     title = models.CharField(verbose_name="書名", max_length=32)     price = models.DecimalField(verbose_name="價格", max_digits=5, decimal_places=2)     PublishDate = models.DateField(verbose_name="初版日期")     publish = models.ForeignKey(to=Publish, verbose_name="所屬出版社", on_delete=models.CASCADE)   # 圖書Many作者 class BookManyAuthor(models.Model):     book = models.ForeignKey(to=Book, verbose_name="所屬圖書", on_delete=models.CASCADE)     author = models.ForeignKey(to=Author, verbose_name="所屬作者", on_delete=models.CASCADE)

Mysql.sql

數據同上述Excel圖一致!

web_author.sql  web_book.sql  web_bookmanyauthor.sql  web_publish.sql

查詢操作

本次采用單獨使用Django ORM的方式,不需要將Django運行起來,所以也不需要寫url什么的了!

前置導入

import os import django  # django_orm_demo為我的項目名稱 os.environ.setdefault("DJANGO_SETTINGS_MODULE", "django_orm_demo.settings") django.setup()  # 導入models一定要在 django.setup() 之后 from web import models

查詢所有(all)

語法

models.<模型類>.objects.all()

例如:查詢所有作者

author_list = models.Author.objects.all() print(author_list)

執行結果

怎么理解Django ORM操作

例如:查詢所有圖書,并且遍歷詳情

book_list = models.Book.objects.all() for book in book_list:     print(book.title, book.price, book.PublishDate, book.publish)

執行結果

怎么理解Django ORM操作

查詢指定條件(filter)

語法

models.<模型類>.objects.filter(<條件>)

例如:查詢張三的信息

author = models.Author.objects.filter(name="張三") print(author) print(author.name)

執行結果

怎么理解Django ORM操作

似乎你發現了個錯誤,'QuerySet' object has no attribute 'name'。

這是因為filter(<條件>)查詢出來的,可能不止一個值,就像name=張三,可能有很多張三!

所以獲取的是一個列表,注意第一個紅色圈圈,如果我明明知道就是一個值,也就像取第一個值,咋辦?

first

通過first,拿到的就是第一個值,同時也是模型類對象

代碼

author = models.Author.objects.filter(name="張三").first() print(author,type(author)) print(author.name,author.phone)

執行結果

怎么理解Django ORM操作

filter支持多條件

假設有倆張三

怎么理解Django ORM操作

如果我想取第二個張三咋辦?

要是能寫倆條件就好了比如這樣name=張三 and age=22。

注:filter后面只能跟filter或者first,filter里面的條件都是and查詢

代碼

# filter里面多個條件是and查詢 author = models.Author.objects.filter(name="張三",age=22).first() print(author,type(author)) print(author.name,author.phone)

執行結果

怎么理解Django ORM操作

常用filter條件列表

熟悉Mysql的可能都知道,有=,<,<=,like等各種范圍查詢,同樣,Django也同樣支持!

filter通過__來構造條件

# 包含三 字段__contains="三" # 原生SQL條件:where 字段 like "%三%" # 以三開頭 字段__startswith="三" # 原生SQL條件:where 字段 like "三%" # 以三結尾 字段__startswith="三" # 原生SQL條件:where 字段 like "%三" # 為空 字段__isnull=True # 原生SQL條件:where 字段 IS NULL # 不為空 字段__isnull=False # 原生SQL條件:where 字段 IS NOT NULL # in 字段__in=[1,2,3] # 原生SQL條件:where 字段 IN (1, 2, 3) # > 字段__gt=1 # 原生SQL條件:where 字段 > 1 # >= 字段__gte=1 # 原生SQL條件:where 字段 >= 1 # < 字段__lt=1 # 原生SQL條件:where 字段 < 1 # <= 字段__lte=1 # 原生SQL條件:where 字段 <= 1 # 日期字段,年 日期字段__year=2020 # 原生SQL條件:where 日期字段 BETWEEN 2020-01-01 AND 2020-12-31 # 日期字段,月 日期字段__month=3 # 原生SQL條件:where EXTRACT(MONTH FROM 表名.日期字段) = 3 # 日期字段,天 日期字段__day=4 # 原生SQL條件:where EXTRACT(DAY FROM 表名.日期字段) = 4 # 時間比大小,|為或的意思 日期字段__gt|lt|...="2020-10-10" # 原生SQL條件:where 日期字段 > 2020-10-10 # 比大小還可以是時間類型 import datetime 日期字段__gt|lt|...=datetime.date(2020,10,10)# 同上 # 時間范圍篩選 日期字段__range=("2020-01-01","2020-06-01") # 原生SQL條件:where 時間字段 BETWEEN 2020-01-01 AND 2020-06-01 日期字段__range=(datetime.date(2020,1,1),datetime.date(2020,6,1)) # 同上

get

其實當我們只需要獲取一個值時,還可以使用get。

代碼

author = models.Author.objects.get(name="李四") print(author,type(author)) print(author.name,author.phone)

執行結果

怎么理解Django ORM操作

但是這個get不太推薦使用,原因如下

  • 如果get條件獲取了倆或倆以上的值,會報錯。

  • 如果get條件獲取不到值,還是會報錯。

示例代碼

author = models.Author.objects.get(name="張三") # error:get() returned more than one Author -- it returned 2!  author = models.Author.objects.get(name="不存在") # error:Author matching query does not exist. author = models.Author.objects.filter(name="不存在").first() # 結果:None

所以,推薦使用filter,如果確定只有一條,那就filter().first(),如果需要多條,遍歷即可!

query

在某些特殊情況下,我們可能對于查詢的結果感到有些意外!

可能需要看看原生SQL是啥,這時候需要用到query。

注:query只能用在filter()后面。

代碼

sql = models.Author.objects.filter(name="李四").query print(sql)

執行結果

怎么理解Django ORM操作

到此,相信大家對“怎么理解Django ORM操作”有了更深的了解,不妨來實際操作一番吧!這里是億速云網站,更多相關內容可以進入相關頻道進行查詢,關注我們,繼續學習!

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

邹城市| 报价| 博野县| 望都县| 宣城市| 随州市| 洪雅县| 桓台县| 乐清市| 紫阳县| 湖北省| 固始县| 城步| 赤城县| 辽源市| 灵丘县| 唐河县| 六盘水市| 南皮县| 翁源县| 霍林郭勒市| 德州市| 兴山县| 醴陵市| 乌鲁木齐市| 龙泉市| 原阳县| 苏尼特左旗| 锡林浩特市| 夏河县| 江永县| 彩票| 会昌县| 宜兰县| 万安县| 天柱县| 海城市| 信阳市| 福海县| 肥城市| 靖西县|