新聞中心
這期內(nèi)容當(dāng)中小編將會給大家?guī)碛嘘P(guān)Django中ORM的用法,文章內(nèi)容豐富且以專業(yè)的角度為大家分析和敘述,閱讀完這篇文章希望大家可以有所收獲。
為鞏留等地區(qū)用戶提供了全套網(wǎng)頁設(shè)計(jì)制作服務(wù),及鞏留網(wǎng)站建設(shè)行業(yè)解決方案。主營業(yè)務(wù)為網(wǎng)站建設(shè)、網(wǎng)站制作、鞏留網(wǎng)站設(shè)計(jì),以傳統(tǒng)方式定制建設(shè)網(wǎng)站,并提供域名空間備案等一條龍服務(wù),秉承以專業(yè)、用心的態(tài)度為用戶提供真誠的服務(wù)。我們深信只要達(dá)到每一位用戶的要求,就會得到認(rèn)可,從而選擇與我們長期合作。這樣,我們也可以走得更遠(yuǎn)!
ORM用法
1.字段類型:
屬性名 = models.字段類型,定義屬性時(shí)需要指定字段類型, 通過字段類型的參數(shù)指定選項(xiàng)。
屬性名
1.不允許使用python的保留關(guān)鍵字。
2.不允許使用MySQL的保留關(guān)鍵字。
3.不允許使用連續(xù)的下劃線,因?yàn)镈jango的查詢語法就是連續(xù)的下劃線。
AutoField:自動(dòng)增長的IntegerField, 不指定時(shí)Django會自動(dòng)創(chuàng)建屬性名為id的自動(dòng)增長屬性
BooleanField:布爾字段,值為True或False
NullBooleanField:支持Null、True、False三種值
CharField(max_length=20):字符串
參數(shù)max_length表示最大字符個(gè)數(shù)
TextFiled:大文本字段,一般超過4000個(gè)字符時(shí)使用
IntegerField:整數(shù)
DecimalField(max_digits=None, decimal_places=None):可以指定精度的十進(jìn)制浮點(diǎn)數(shù)
參數(shù)max_digits表示總位數(shù)
參數(shù)decimal_places表示小數(shù)位數(shù)
FloatField():浮點(diǎn)數(shù)
DateField[auto_now=False, auto_now_add=False]):日期
參數(shù)auto_now表示每次保存對象時(shí),自動(dòng)設(shè)置該字段為當(dāng)前時(shí)間,用于"最后一次修改"的時(shí)間戳,它總是使用當(dāng)前日期,默認(rèn)為false。
參數(shù)auto_now_add表示當(dāng)對象第一次被創(chuàng)建時(shí)自動(dòng)設(shè)置當(dāng)前時(shí)間,用于創(chuàng)建的時(shí)間戳,它總是使用當(dāng)前日期,默認(rèn)為false。
參數(shù)auto_now_add和auto_now是相互排斥的,組合將會發(fā)生錯(cuò)誤。
TimeField:參數(shù)和DateField一樣。
DateTimeField:日期時(shí)間,參數(shù)同DateField。
FileField:上傳文件字段,以二進(jìn)制的形式。
ImageField:繼承于FileField,對上傳的內(nèi)容進(jìn)行校驗(yàn),確保是有效的圖片。
2.字段選項(xiàng):
null:如果為True,表示允許為空,默認(rèn)值是False。
blank:如果為True,則該字段允許為空白,默認(rèn)值是False。
對比:null是數(shù)據(jù)庫范疇的概念,blank是表單驗(yàn)證范疇的。
db_column:字段的名稱,如果未指定,則使用屬性的名稱(只限于數(shù)據(jù)庫表中的名字,操作數(shù)據(jù)庫還是類屬性的名字)。
db_index:若值為True, 則在表中會為此字段創(chuàng)建索引,默認(rèn)值是False(為了優(yōu)化查詢速度 )。
default:默認(rèn)值,這可以是值或可調(diào)用對象。如果可調(diào)用,則每次創(chuàng)建新對象時(shí)都會調(diào)用它。
primary_key:若為True,則該字段會成為模型的主鍵字段,默認(rèn)值是False,一般作為AutoField的選項(xiàng)使用。
unique:如果為True, 這個(gè)字段在表中必須有唯一值,這個(gè)值不能重復(fù),默認(rèn)值是False。
關(guān)系型字段類型:關(guān)聯(lián)表中使用
注意:Django會自動(dòng)為表創(chuàng)建主鍵字段
如果使用選項(xiàng)設(shè)置某屬性為主鍵字段后,Django不會再創(chuàng)建自動(dòng)增長的主鍵字段
默認(rèn)創(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'
3.關(guān)系字段類型
關(guān)系型數(shù)據(jù)庫的關(guān)系包括三種類型:
ForeignKey:一對多,將字段定義在多的一端中。
ManyToManyField:多對多,將字段定義在任意一端中。
OneToOneField:一對一,將字段定義在任意一端中。
可以維護(hù)遞歸的關(guān)聯(lián)關(guān)系,使用self指定。
4.元選項(xiàng):
作用:修改數(shù)據(jù)庫表的默認(rèn)的名稱。
數(shù)據(jù)庫表的默認(rèn)名稱為 :
應(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' #自定義表的名字
5.模型成員
objects : 管理器對象
是Manager類型的對象,定義在from django.db import models中。
用于模型對象和數(shù)據(jù)庫交互
是默認(rèn)自動(dòng)生成的屬性,但是可以自定義管理器對象。
自定義管理器對象后,Django不再生成默認(rèn)管理器對象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ù)時(shí)直接使用 Users 查詢,不再用默認(rèn)的objects。
# 書籍列表信息視圖 def userList(request): # 查詢數(shù)據(jù)庫用戶信息 : 默認(rèn)管理器對象--objects # UserInfos = UserInfo.objects.all() # 查詢數(shù)據(jù)庫用戶信息 : 自定義管理器對象--Users UserInfos = UserInfo.Users.all() # 構(gòu)造上下文 context = {'Userlist':UserInfos} return render(request, 'User/Userlist.html', context)
Manager:管理器類
定義在from django.db import models中
管理器是Django的模型進(jìn)行數(shù)據(jù)庫操作的接口,Django應(yīng)用的每個(gè)模型都擁有至少一個(gè)管理器。
Django模型支持自定義管理器類,繼承自models.Manager。
自定義管理器類主要用于兩種情況:
1.修改原始查詢集,重寫get_queryset()方法
查詢時(shí),如果需要默認(rèn)過濾掉某些數(shù)據(jù),需要修改原始查詢集
2.新增管理器方法,如創(chuàng)建模型對象方法
當(dāng)模型屬性很多,多數(shù)字段為默認(rèn)值,每次只需要給少數(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).成員 # 默認(rèn)只查詢邏輯刪除字段為False的記錄 return super(PeopleInfoManager, self).get_queryset().filter(isDelete=False)
自定義管理器類:2.新增管理器方法
新增管理器初始化模型對象方法:只有name屬性需要賦值,其他的字段都是默認(rèn)值.
# models.py -- 自定義管理器類 class UserInfoManager(models.Manager): # 自定義管理器類場景一:重寫get_queryset()方法 def get_queryset(self): # 調(diào)用父類的成員語法為:super(子類型, self).成員 # 默認(rèn)只查詢邏輯刪除字段為False的記錄 return super(UserInfoManager, self).get_queryset().filter(isDelete=False) # 初始化模型對象方法 def create(self, name): user = UserInfo() user.name = name user.pub_date = '1989-11-11' user.readcount = 0 user.commentcount = 0 user.isDelete = False return 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)
上述就是小編為大家分享的Django中ORM的用法了,如果剛好有類似的疑惑,不妨參照上述分析進(jìn)行理解。如果想知道更多相關(guān)知識,歡迎關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道。
分享標(biāo)題:Django中ORM的用法
文章出自:http://fisionsoft.com.cn/article/jhhsge.html