日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

django之ORM介绍与基本用法(一)

發(fā)布時間:2025/3/21 编程问答 43 豆豆
生活随笔 收集整理的這篇文章主要介紹了 django之ORM介绍与基本用法(一) 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

文章目錄

  • ORM介紹
  • ORM用法
    • 字段類型:
    • 字段選項:
    • 關(guān)系字段類型
    • 元選項:
    • 模型成員
    • Manager:管理器類
    • 自定義管理器類:1.修改原始查詢集
    • 自定義管理器類:2.新增管理器方法

ORM介紹

1.什么是ORM

  • ORM 全拼Object-Relation Mapping.

  • 中文意為 對象-關(guān)系映射.

  • 在MVC/MVT設(shè)計模式中的Model模塊中都包括ORM

2.ORM優(yōu)勢

(1)只需要面向?qū)ο缶幊? 不需要面向數(shù)據(jù)庫編寫代碼.

  • 對數(shù)據(jù)庫的操作都轉(zhuǎn)化成對類屬性和方法的操作.
  • 不用編寫各種數(shù)據(jù)庫的sql語句.

(2)實現(xiàn)了數(shù)據(jù)模型與數(shù)據(jù)庫的解耦, 屏蔽了不同數(shù)據(jù)庫操作上的差異.

  • 不在關(guān)注用的是mysql、oracle…等.
  • 通過簡單的配置就可以輕松更換數(shù)據(jù)庫, 而不需要修改代碼.

3.ORM劣勢

  • 相比較直接使用SQL語句操作數(shù)據(jù)庫,有性能損失.
  • 根據(jù)對象的操作轉(zhuǎn)換成SQL語句,根據(jù)查詢的結(jié)果轉(zhuǎn)化成對象, 在映射過程中有性能損失

4.ORM和數(shù)據(jù)庫關(guān)系:

在Django中model是你數(shù)據(jù)的單一、明確的信息來源。它包含了你存儲的數(shù)據(jù)的重要字段和行為。通常,一個模型(model)映射到一個數(shù)據(jù)庫表.

基本情況:

每個模型都是一個Python類,它是django.db.models.Model的子類。

模型的每個屬性都代表一個數(shù)據(jù)庫字段。

綜上所述,Django為您提供了一個自動生成的數(shù)據(jù)庫訪問API。

ORM用法

字段類型:

屬性名 = models.字段類型,定義屬性時需要指定字段類型, 通過字段類型的參數(shù)指定選項

屬性名

  • 不允許使用python的保留關(guān)鍵字
  • 不允許使用mysql的保留關(guān)鍵字
  • 不允許使用連續(xù)的下劃線,因為Django的查詢語法就是連續(xù)的下劃線

AutoField:
自動增長的IntegerField, 不指定時Django會自動創(chuàng)建屬性名為id的自動增長屬性

BooleanField:
布爾字段,值為True或False

NullBooleanField:
支持Null、True、False三種值

CharField(max_length=20):
字符串

  • 參數(shù)max_length表示最大字符個數(shù)

TextFiled:
大文本字段,一般超過4000個字符時使用

IntegerField:
整數(shù)

DecimalField(max_digits=None, decimal_places=None):可以指定精度的十進制浮點數(shù)

  • 參數(shù)max_digits表示總位數(shù)
  • 參數(shù)decimal_places表示小數(shù)位數(shù)

FloatField():
浮點數(shù)

DateField[auto_now=False, auto_now_add=False]):日期

  • 參數(shù)auto_now表示每次保存對象時,自動設(shè)置該字段為當前時間,用于"最后一次修改"的時間戳,它總是使用當前日期,默認為false
  • 參數(shù)auto_now_add表示當對象第一次被創(chuàng)建時自動設(shè)置當前時間,用于創(chuàng)建的時間戳,它總是使用當前日期,默認為false
  • 參數(shù)auto_now_add和auto_now是相互排斥的,組合將會發(fā)生錯誤
    TimeField:參數(shù)和DateField一樣

DateTimeField:
日期時間,參數(shù)同DateField

FileField:
上傳文件字段,以二進制的形式

ImageField:
繼承于FileField,對上傳的內(nèi)容進行校驗,確保是有效的圖片

字段選項:

null:
如果為True,表示允許為空,默認值是False

blank:
如果為True,則該字段允許為空白,默認值是False

  • 對比:null是數(shù)據(jù)庫范疇的概念,blank是表單驗證范疇的

db_column:
字段的名稱,如果未指定,則使用屬性的名稱(只限于數(shù)據(jù)庫表中的名字,操作數(shù)據(jù)庫還是類屬性的名字)

db_index:
若值為True, 則在表中會為此字段創(chuàng)建索引,默認值是False(為了優(yōu)化查詢速度 )

default:
默認值,這可以是值或可調(diào)用對象。如果可調(diào)用,則每次創(chuàng)建新對象時都會調(diào)用它。

primary_key:
若為True,則該字段會成為模型的主鍵字段,默認值是False,一般作為AutoField的選項使用

unique:
如果為True, 這個字段在表中必須有唯一值,這個值不能重復(fù),默認值是False

關(guān)系型字段類型:關(guān)聯(lián)表中使用

注意:Django會自動為表創(chuàng)建主鍵字段

  • 如果使用選項設(shè)置某屬性為主鍵字段后,Django不會再創(chuàng)建自動增長的主鍵字段
  • 默認創(chuàng)建的主鍵字段為id,可以使用pk代替,pk全拼為primary key
class PeopleInfo(models.Model):name = models.CharField(max_length=20) #人物姓名gender = models.BooleanField(default=True) #人物性別description = models.CharField(max_length=20) #人物描述isDelete = models.BooleanField(default=False) #邏輯刪除book = models.ForeignKey(BookInfo) # 外鍵約束,人物屬于哪本書pub_date = models.DateField(null=True) #日期readcount = models.IntegerField(default=0) #閱讀量commentcount = models.IntegerField(default=0) #評論量isDelete = models.BooleanField(default=False) #邏輯刪除# 元類信息 : 修改表名class Meta:db_table = 'peopleinfo'

關(guān)系字段類型

關(guān)系型數(shù)據(jù)庫的關(guān)系包括三種類型:

  • ForeignKey:一對多,將字段定義在多的一端中
  • ManyToManyField:多對多,將字段定義在任意一端中
  • OneToOneField:一對一,將字段定義在任意一端中
  • 可以維護遞歸的關(guān)聯(lián)關(guān)系,使用self指定

元選項:

作用:修改數(shù)據(jù)庫表的默認的名稱

數(shù)據(jù)庫表的默認名稱為 :

應(yīng)用名_模型名例:Book應(yīng)用中定義BookInfo模型類Book_bookinfo

在模型類中定義元類Meta,用于設(shè)置元信息,使用db_table自定義表的名字

# 書籍信息模型class BookInfo(models.Model):name = models.CharField(max_length=20) #圖書名稱class Meta: #元信息類db_table = 'bookinfo' #自定義表的名字

模型成員

objects : 管理器對象

  • 是Manager類型的對象,定義在from django.db import models中

  • 用于模型對象和數(shù)據(jù)庫交互

  • 是默認自動生成的屬性,但是可以自定義管理器對象

  • 自定義管理器對象后,Django不再生成默認管理器對象objects

自定義管理器對象

  • 為模型類UserInfo自定義管理器對象Users
# 用戶信息模型class UserInfo(models.Model):name = models.CharField(max_length=20) #名稱pub_date = models.DateField(null=True) #日期readcount = models.IntegerField(default=0) #閱讀量commentcount = models.IntegerField(default=0) #評論量isDelete = models.BooleanField(default=False) #邏輯刪除#元類信息 : 修改表名class Meta:db_table = 'Userinfo'# 自定義管理器對象Users = models.Manager()
  • 自定義管理器對象后,查詢數(shù)據(jù)時直接使用 Users 查詢,不再用默認的objects
# 書籍列表信息視圖def userList(request):# 查詢數(shù)據(jù)庫用戶信息 : 默認管理器對象--objects# UserInfos = UserInfo.objects.all()# 查詢數(shù)據(jù)庫用戶信息 : 自定義管理器對象--UsersUserInfos = UserInfo.Users.all()# 構(gòu)造上下文context = {'Userlist':UserInfos}return render(request, 'User/Userlist.html', context)

Manager:管理器類

  • 定義在from django.db import models中

  • 管理器是Django的模型進行數(shù)據(jù)庫操作的接口,Django應(yīng)用的每個模型都擁有至少一個管理器

  • Django模型支持自定義管理器類,繼承自models.Manager

  • 自定義管理器類主要用于兩種情況

  • 修改原始查詢集,重寫get_queryset()方法
  • 查詢時,如果需要默認過濾掉某些數(shù)據(jù),需要修改原始查詢集
  • 新增管理器方法,如創(chuàng)建模型對象方法
  • 當模型屬性很多,多數(shù)字段為默認值,每次只需要給少數(shù)屬性賦值時,可以新增模型初始化方法

自定義管理器類:1.修改原始查詢集

把peopleinfo表中的isDelete字段修改為True(updata peopleinfo set isDelete=1 where id=4),但是邏輯刪除字段為True的那條記錄依然會被查詢出來,這里的解決辦法是自定義管理器類,重寫get_queryset()方法

from django.db import models## 自定義管理器類class PeopleInfoManager(models.Manager):# 自定義管理器類場景一:重寫get_queryset()方法def get_queryset(self):# 調(diào)用父類的成員語法為:super(子類型, self).成員# 默認只查詢邏輯刪除字段為False的記錄return super(PeopleInfoManager, self).get_queryset().filter(isDelete=False)

自定義管理器類:2.新增管理器方法

新增管理器初始化模型對象方法:只有name屬性需要賦值,其他的字段都是默認值# models.py -- 自定義管理器類class UserInfoManager(models.Manager):# 自定義管理器類場景一:重寫get_queryset()方法def get_queryset(self):# 調(diào)用父類的成員語法為:super(子類型, self).成員# 默認只查詢邏輯刪除字段為False的記錄return super(UserInfoManager, self).get_queryset().filter(isDelete=False)# 初始化模型對象方法def create(self, name):user = UserInfo()user.name = nameuser.pub_date = '1989-11-11'user.readcount = 0user.commentcount = 0user.isDelete = Falsereturn user # view.py -- User列表信息視圖def UserList(request):# 初始化模型對象:自定義管理器類后UserInfos = [UserInfo.user.create('小明'),UserInfo.user.create('小杰'),]# 構(gòu)造上下文context = {'Userlist':UserInfos}return render(request, 'User/userlist.html', context)

參考鏈接

總結(jié)

以上是生活随笔為你收集整理的django之ORM介绍与基本用法(一)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。