?
Django對象的增刪改查
我們為了對django對象的增刪改查進行總結,先在model.py文件中創建類便于舉例
定義學生:
class Students(models.Model):sname=models.CharField(max_length=20)sgender=models.BooleanField(default=True)sage=models.IntegerField()sscord=models.CharField(max_length=20)isDelete=models.BooleanField(default=False)# 這里可以添加Meta類進行對元類的重命名和排序操作class Meta:db_table=xxx # 定義數據表名,推薦使用小寫字母ordering=[] # 對象的默認排序字段 ,獲取對象列表時使用,通常是Integer(整數)類型,升序ordering['id'],降序用ordering['-id']
然后在url.py文件中添加一個鏈接轉到views.py文件中:
url(r'^show/',views.show)
接下來在views.py文件中進行具體的增刪改查操作
下面是一些例子:
查詢:
# 類名.objects.all() #查詢所有對象
Students.objects.all()# 類名.object.get('條件') #查詢單個對象
Students.object.get(sage=18)# 類名.object.filter.(條件查詢) #模糊查詢
#查詢年齡小于等于18歲的學生信息
Student.objects.filter(age__lte=20).all()
#查詢出年齡大于等于18歲的用戶信息,但是使用的是exclude函數
Students.objects.exclude(age__gt=18).all()# 查詢結果集的數量
Students.objects.all().count()# 判斷查詢結果集是否有值
Students.objects.all().exists()# 使用切片的形式拿到前幾個值
Students.objects.all()[0:3]# 求出年齡大于學分的所有學生信息
# Student.object.filter(sage__gt=F('sscord')).all()# 求出年齡大于20,并且姓名包含e的所有信息
Students.object.filter(sage__gt=20).filter(sname__contains='e').all()
修改:
# 排序 (默認升序,降序的話屬性前面加‘-’)
Students.objects.order_by('sage')#修改
得到對應的對象
模型對象.屬性=屬性值
模型對象.save()
stu=Students.object.get(sage=18)
stu.sage=19
stu.save()
刪除:
獲得對象名
對象名.delete()
stu = Students.objects.get(pk=1)
stu.delete()
增加:
對象.save
stu=Students()
sname=jeck
sage=18
sscord=60
stu.save()
context = {'stu':stu}
return render(request,'show.html',context=context)或者直接返回
return render(request,'show.html',locals())
最后在show.py文件里展示views.py文件中的內容
show.py:
<ul>{% for i in stu %}<li>{{ i.sname }}</li>{% endfor %}
</ul>
上面只是一些大概的例子,下面進行總結:
--------------------------------------------------------------------------
ORM(Object Relational Mapping)對象關系映射,是一種程序技術,用于實現面向對象編程語言里不同類型系統的數據之間的轉換。
可以簡單理解為翻譯機,用于django與數據庫交互
Django默認通過模型的‘objects’對象實現模型數據查詢
Django有兩種過濾器用于篩選記錄:
filter :返回符合篩選條件的數據集
exclude :返回不符合篩選條件的數據集
多個filter 和 exclude可以連接在一起查詢
返回查詢集:
all() :返回所有數據
filter() :返回符合條件的數據
exclude():過濾掉符合條件的數據
order_by():排序
values():一條數據就是一個字典,返回一個列表
返回單個數據:
get():返回一個滿足條件的對象,沒有找到會引發模型類.DoesNotExist異常,找到多個會引發模型類.MultiObjectsReturned異常
first():返回查詢集中的第一個對象
last():返回查詢集的最后一個對象
count():返回當前查詢集中的對象個數
exists():判斷查詢集中是否有數據,如果有返回True,反之返回False
限制查詢集和查詢集的緩存:
限制查詢集可以使用下標的方法進行限制,等同于sql中的limit
studentList=Students.objects.all()[0:5] #下標不能是負數
查詢集的緩存:每個查詢集都有一個緩存,來最小化對數據庫的訪問
在新建的查詢集中,緩存首次為空,第一次對查詢集求值,會發生數據緩存,django會將查詢出來的數據做一個緩存,并返回查詢結構,以后查詢直接使用查詢集的緩存
過濾器filter(),exclude()以及get()的參數:
語法:屬性名稱_比較運算符=值比較運算符:
exact:判斷,大小寫敏感, filter(isDelete=False)
contains:是否包含,大小寫敏感, filter(sname_contains='趙')
startswith,endswith:以values開頭或結尾,大小寫敏感
在以上四個運算符前加上i(ignore)就不區分大小寫了
isnull,isnotnull:是否為空, filter(sname_isnull=False)
in:是否包含在范圍內,filter(pk_in=[1,2,3,4])
gt,gte,lt,lte:大于,大于等于,小于,小于等于, filter(sage_gt=30)表示時間的:
year,month,day,week_day,hour,minute,second:filter(lasttime__year=2017)
pk:代表主鍵,filter(pk=1)跨關系查詢:
模型類名__屬性名__比較運算符,實際上就是處理的數據庫中的join
grade = Grade.objects.filter(student__scontend__contains='趙錢孫')
描述中帶有'趙錢孫'這三個字的數據屬于哪個班級聚合函數:
使用aggregate()函數返回聚合函數的值
Avg:平均值
Count:數量
Max:最大
Min:最小
Sum:求和
Student.objects().aggregate(Max('sage'))
F對象:
可以使用模型的A屬性與B屬性進行比較
grades = Grade.objects.filter(ggirlnum__gt=F('gboynum') )
F對象支持算數運算
grades = Grade.objects.filter(ggirlnum__gt=F('gboynum') +10 )
Q對象:
過濾器的方法中的關鍵參數,常用于組合條件
年齡小于25
Student.objects.filter(Q(sage__lt=25))
Q對象語法支持 | (or), & (and), ~(取反)
年齡大于等于的
Student.objects.filter(~Q(sage__lt=25))
-------------------------------------------------------
在Django中,我們有些時候使用Django自帶的ORM語句無法達到操作數據庫的效果,這時,我們可以自定義一個管理器來進行數據庫的操作。從總體上來說,就是重寫方法和自定義方法
django的隱性屬性和顯性屬性
顯性: 自己寫的那些
隱性: objects 是一個Manager類型的一個對象,作用于數據庫進行交互
自定義模型管理器作用:
可以向管理器中添加額外的方法
修改管理器返回的原始查詢集
提供創建對象的方式
不同的操作在不同的類中,如all() 在Manager類,get()在Query類中
一個例子說明自定義管理器類的作用:
通過Student.objects.all() 查詢sgender為True的記錄class Student(models.Model):sno = models.AutoField(primary_key=True)sname = models.CharField(max_length=30,null=False)sgender = models.BooleanField(default=False)objects = getAllTrue() #創建一個自定義類對象def __str__(self):return "Student:%s--%s"%(self.sname,self.sgender)#自定義管理類
class getAllTrue(models.Manager): #all()來自于Manager類# def all(self): #重寫方法# return Manager.all(self).filter(sgender = True) #功能操作def get_queryset(self): # 與all() 方法相同,在源碼中,all()執行就是調用get_queryset()方法。return Manager.get_queryset(self).filter(sgender=True)