偷偷摘套内射激情视频,久久精品99国产国产精,中文字幕无线乱码人妻,中文在线中文a,性爽19p

一篇文章帶你了解Django ORM操作(基礎篇)

開發(fā) 前端
在日常開發(fā)中,需要大量對數(shù)據(jù)庫進行增刪改查操作。如果頭鐵的話,使用原生SQL是最好的,畢竟性能又高,又靈活。

[[360778]]

前言

在日常開發(fā)中,需要大量對數(shù)據(jù)庫進行增刪改查操作。

如果頭鐵的話,使用原生SQL是最好的,畢竟性能又高,又靈活。

但是通常情況下,我們不是太需要那么苛刻的性能,也沒有那么多刁鉆的需求用原生SQL

通常會使用簡單快捷的ORM進行增刪改查

一起看學習一下Django的ORM操作吧

表結構設計

還是從實際角度出發(fā)。

假設,現(xiàn)在我需要設計一個簡單的圖書管理系統(tǒng),是那種買的書,不是圖書館的書!!!

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

 

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

 

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

 

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

 

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

 

Django models代碼

  1. from django.db import models 
  2.  
  3.  
  4. # 作者表 
  5. class Author(models.Model): 
  6.     name = models.CharField(verbose_name="作者姓名", max_length=8) 
  7.     age = models.IntegerField(verbose_name="作者年齡"
  8.     phone = models.CharField(verbose_name="作者聯(lián)系方式", max_length=11) 
  9.  
  10.  
  11. # 出版社 
  12. class Publish(models.Model): 
  13.     title = models.CharField(verbose_name="出版社名稱", max_length=16) 
  14.     phone = models.CharField(verbose_name="出版聯(lián)系方式", max_length=11) 
  15.  
  16.  
  17. # 圖書 
  18. class Book(models.Model): 
  19.     title = models.CharField(verbose_name="書名", max_length=32) 
  20.     price = models.DecimalField(verbose_name="價格", max_digits=5, decimal_places=2) 
  21.     PublishDate = models.DateField(verbose_name="初版日期"
  22.     publish = models.ForeignKey(to=Publish, verbose_name="所屬出版社", on_delete=models.CASCADE
  23.  
  24.  
  25. # 圖書Many作者 
  26. class BookManyAuthor(models.Model): 
  27.     book = models.ForeignKey(to=Book, verbose_name="所屬圖書", on_delete=models.CASCADE
  28.     author = models.ForeignKey(to=Author, verbose_name="所屬作者", on_delete=models.CASCADE

Mysql.sql

數(shù)據(jù)同上述Excel圖一致!

  1. web_author.sql 
  2.  
  3. web_book.sql 
  4.  
  5. web_bookmanyauthor.sql 
  6.  
  7. web_publish.sql 

查詢操作

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

前置導入

  1. import os 
  2. import django 
  3.  
  4. # django_orm_demo為我的項目名稱 
  5. os.environ.setdefault("DJANGO_SETTINGS_MODULE""django_orm_demo.settings"
  6. django.setup() 
  7.  
  8. # 導入models一定要在 django.setup() 之后 
  9. from web import models 

查詢所有(all)

語法

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

例如:查詢所有作者

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

執(zhí)行結果

 

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

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

執(zhí)行結果

 

查詢指定條件(filter)

語法

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

例如:查詢張三的信息

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

執(zhí)行結果

 

似乎你發(fā)現(xiàn)了個錯誤,'QuerySet' object has no attribute 'name'。

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

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

first

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

代碼

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

執(zhí)行結果

 

filter支持多條件

假設有倆張三

 

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

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

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

代碼

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

執(zhí)行結果

 

常用filter條件列表

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

filter通過__來構造條件

  1. # 包含三 
  2. 字段__contains="三" # 原生SQL條件:where 字段 like "%三%" 
  3. # 以三開頭 
  4. 字段__startswith="三" # 原生SQL條件:where 字段 like "三%" 
  5. # 以三結尾 
  6. 字段__startswith="三" # 原生SQL條件:where 字段 like "%三" 
  7. # 為空 
  8. 字段__isnull=True # 原生SQL條件:where 字段 IS NULL 
  9. # 不為空 
  10. 字段__isnull=False # 原生SQL條件:where 字段 IS NOT NULL 
  11. in 
  12. 字段__in=[1,2,3] # 原生SQL條件:where 字段 IN (1, 2, 3) 
  13. # > 
  14. 字段__gt=1 # 原生SQL條件:where 字段 > 1 
  15. # >= 
  16. 字段__gte=1 # 原生SQL條件:where 字段 >= 1 
  17. # < 
  18. 字段__lt=1 # 原生SQL條件:where 字段 < 1 
  19. # <= 
  20. 字段__lte=1 # 原生SQL條件:where 字段 <= 1 
  21. # 日期字段,年 
  22. 日期字段__year=2020 # 原生SQL條件:where 日期字段 BETWEEN 2020-01-01 AND 2020-12-31 
  23. # 日期字段,月 
  24. 日期字段__month=3 # 原生SQL條件:where EXTRACT(MONTH FROM 表名.日期字段) = 3 
  25. # 日期字段,天 
  26. 日期字段__day=4 # 原生SQL條件:where EXTRACT(DAY FROM 表名.日期字段) = 4 
  27. # 時間比大小,|為或的意思 
  28. 日期字段__gt|lt|...="2020-10-10" # 原生SQL條件:where 日期字段 > 2020-10-10 
  29. # 比大小還可以是時間類型 
  30. import datetime 
  31. 日期字段__gt|lt|...=datetime.date(2020,10,10)# 同上 
  32. # 時間范圍篩選 
  33. 日期字段__range=("2020-01-01","2020-06-01") # 原生SQL條件:where 時間字段 BETWEEN 2020-01-01 AND 2020-06-01 
  34. 日期字段__range=(datetime.date(2020,1,1),datetime.date(2020,6,1)) # 同上 

get

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

代碼

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

執(zhí)行結果

 

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

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

示例代碼

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

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

query

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

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

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

代碼

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

執(zhí)行結果

 

總結

本篇通過一個類似實際的需求,進行了一個表結構設計。

有書表,出版社表,作者表,圖書和作者多對多表。

以這幾張表為例,進行Django ORM的學習。

學習了如何查詢所有,如何條件查詢,filter常用條件有哪些。

get和filter().first()區(qū)別,如何通過query進行查看原生SQL。

如果在操作過程中有任何問題,記得下面留言,我們看到會第一時間解決問題。

 

用微笑告訴別人,今天的我比昨天強,今后也一樣。

本文轉載自微信公眾號「 Python爬蟲與數(shù)據(jù)挖掘」,可以通過以下二維碼關注。轉載本文請聯(lián)系 Python爬蟲與數(shù)據(jù)挖掘公眾號。

 

責任編輯:武曉燕 來源: Python爬蟲與數(shù)據(jù)挖掘
相關推薦

2021-01-05 09:07:30

Django ORMF查詢Q查詢

2021-01-01 09:20:20

操作DjangoORM

2021-01-12 09:04:12

Django FormForm組件開發(fā)

2023-05-12 08:19:12

Netty程序框架

2021-06-30 00:20:12

Hangfire.NET平臺

2023-09-06 14:57:46

JavaScript編程語言

2021-05-18 08:30:42

JavaScript 前端JavaScript時

2021-06-24 09:05:08

JavaScript日期前端

2021-09-27 09:18:30

ListIterato接口方法

2021-01-26 23:46:32

JavaScript數(shù)據(jù)結構前端

2021-03-05 18:04:15

JavaScript循環(huán)代碼

2021-03-09 14:04:01

JavaScriptCookie數(shù)據(jù)

2024-04-19 14:23:52

SwitchJavaScript開發(fā)

2023-07-30 15:18:54

JavaScript屬性

2021-02-26 20:01:57

SVG濾鏡元素

2023-05-08 08:21:15

JavaNIO編程

2024-01-30 13:47:45

2020-12-08 08:09:49

SVG圖標Web

2020-11-10 10:48:10

JavaScript屬性對象

2021-06-04 09:56:01

JavaScript 前端switch
點贊
收藏

51CTO技術棧公眾號