使用Django框架中ORM系統(tǒng)實(shí)現(xiàn)對(duì)數(shù)據(jù)庫數(shù)據(jù)增刪改查
1.數(shù)據(jù)的增刪改查----------增加數(shù)據(jù)
在視圖函數(shù)中導(dǎo)入U(xiǎn)ser模型類,然后使用下面的方法添加數(shù)據(jù):
from django.http import HttpResponse
from .models import User
# Create your views here.
def add_user(request):
#方法一
taka = User(name='taka',age=18)
taka.save()
#方法二
xiaopo = User()
xiaopo.name = 'xiaopo'
xiaopo.age = 18
xiaopo.save()
#方法三
aa = User.objects.get_or_create(name='xiaohong',age=18) #插入前會(huì)進(jìn)行查找,如果沒有相同的數(shù)據(jù)就會(huì)添加;如果有就不會(huì)。
print(aa) #會(huì)返回一個(gè)元組,第一個(gè)數(shù)據(jù)是添加成功的實(shí)例;第二個(gè)數(shù)據(jù)是True或False。(添加成功為True;反之為False)
# 此處打印結(jié)果: (<User: name:xiaohong, age:18>, True)
# 插入前會(huì)進(jìn)行查找,如果沒有相同的數(shù)據(jù)就會(huì)添加;如果有就不會(huì)。 因?yàn)樯厦娌迦肓讼嗤瑪?shù)據(jù),所以此處不會(huì)插入數(shù)據(jù)。
User.objects.get_or_create(name='xiaohong',age=18)
return HttpResponse("插入數(shù)據(jù)成功!")
實(shí)現(xiàn)效果:
(注意:分配一下路由,要訪問到此視圖才會(huì)執(zhí)行?。?/p>


2.數(shù)據(jù)的增刪改查----------查找數(shù)據(jù)
這時(shí)在定義模型類時(shí)定義的__str__()方法的作用就表現(xiàn)了出來
控制查詢的數(shù)據(jù)顯示的格式(即顯示模型的簡單表示)
from django.db import models
# Create your models here.
class User(models.Model):
id = models.AutoField(primary_key=True) #主鍵可以省略,Django默認(rèn)會(huì)為我們加上一個(gè)名為id的主鍵,寫的話就可以改主鍵的名字!
name = models.CharField(max_length=50) # CharField——字符串
age = models.IntegerField() # IntegerField——整數(shù)
def __str__(self):
"""
返回模型的字符串表示
我們告訴Django,默認(rèn)應(yīng)使用哪個(gè)屬性來顯示有關(guān)此模型的信息
Django調(diào)用方法__str__()來顯示模型的簡單表示
"""
return "name:%s, age:%s" %(self.name,self.age)
進(jìn)行查詢:
User模型類導(dǎo)入
from django.http import HttpResponse
from .models import User
def search_user(request):
#查詢所有記錄對(duì)象
rs1 = User.objects.all()
print("這是所有記錄對(duì)象:",rs1) #通過觀察,可以發(fā)現(xiàn)查詢到的記錄對(duì)象的輸出方式就是模型中的__str__的格式.
# 同時(shí)這個(gè)查詢結(jié)果rs1是個(gè)queryset對(duì)象,是一個(gè)類似于列表的對(duì)象。具備列表里的一些常用方法,比如:切片[0:3],下標(biāo)取值rs1[1]...但是下標(biāo)取值的話不支持反向取值。
#查詢一個(gè)記錄對(duì)象
rs2 = User.objects.get(name="xiaopo") # 此方法查詢,如果不存在/存在多條都會(huì)報(bào)錯(cuò)! 所以一般通過id值。
print("這是一個(gè)記錄對(duì)象:",rs2)
#查詢滿足條件的對(duì)象
rs3 = User.objects.filter(name='xiaoming') # 取不到則為空;多條的話都可以取到
print("這是滿足條件的對(duì)象:",rs3)
return HttpResponse("查詢數(shù)據(jù)成功!")
注意:
1.all()和filter()方法返回的是QuerySet對(duì)象,查詢不到則為空(但咋樣都不會(huì)報(bào)錯(cuò),就很牛?。?br />
2.get()方式返回的單個(gè)對(duì)象,如果符合條件的對(duì)象有多個(gè),則get報(bào)錯(cuò)!而且如果查詢不到也會(huì)報(bào)錯(cuò)!
實(shí)現(xiàn)效果:


3.拓展——關(guān)于QuerySet簡單整兩句:
從數(shù)據(jù)庫中查詢出來的結(jié)果一般是一個(gè)集合,這個(gè)集合叫做 QuerySet(是一個(gè)類似于列表的對(duì)象,具備列表里的一些常用方法,比如:切片[0:3],下標(biāo)取值rs1[1]…但是下標(biāo)取值的話不支持反向取值).QuerySet是可迭代對(duì)象.QuerySet支持切片, 不支持負(fù)索引.可以用list強(qiáng)行將QuerySet變成列表.
3.數(shù)據(jù)的增刪改查----------刪除數(shù)據(jù)
from django.http import HttpResponse
from .models import User
def delete_user(request):
#實(shí)例和QuerySet對(duì)象都具備刪除方法!
User.objects.get(id=1).delete() #get方法得到的是單個(gè)對(duì)象(一個(gè)實(shí)例對(duì)象),所以是刪除一條數(shù)據(jù)!
User.objects.filter(age=18).delete() #刪除所有age屬性值為18的數(shù)據(jù)!
User.objects.all().delete() #刪除所有數(shù)據(jù)!
s = User.objects.filter(age=18)
s[1].delete() #刪除age值為18的數(shù)據(jù)中指定的一條
return HttpResponse("刪除數(shù)據(jù)成功!")
4.數(shù)據(jù)的增刪改查----------修改數(shù)據(jù)
from django.http import HttpResponse
from .models import User
def update_user(request):
#第一種方法:先查找到數(shù)據(jù),然后再進(jìn)行屬性賦值修改(對(duì)于實(shí)例的修改)
rs = User.objects.get(name="xiaoming") #修改name屬性值為xiaoming的name屬性值為xiaowang(因?yàn)槭褂昧薵et方法所以僅修改第一條!)
rs.name='xiaowang'
rs.save()
#第二種方法:使用update方法直接修改(對(duì)于集合的修改,只能用于QuerySet對(duì)象)
User.objects.filter(name='xiaowang').update(name='AAA') #修改所有name屬性值為xiaowang的name屬性值為AAA!
User.objects.all().update(age=22) #修改所有數(shù)據(jù)的age屬性值為22!
return HttpResponse("修改數(shù)據(jù)成功!")
以上就是使用Django的ORM實(shí)現(xiàn)對(duì)數(shù)據(jù)庫數(shù)據(jù)增刪改查方法的詳細(xì)內(nèi)容,更多關(guān)于Django中實(shí)現(xiàn)ORM對(duì)數(shù)據(jù)庫操作的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
關(guān)于Python正則表達(dá)式 findall函數(shù)問題詳解
在寫正則表達(dá)式的時(shí)候總會(huì)遇到不少的問題,本文講述了Python正則表達(dá)式中 findall()函數(shù)和多個(gè)表達(dá)式元組相遇的時(shí)候會(huì)出現(xiàn)的問題2018-03-03
OpenCV之理解KNN鄰近算法k-Nearest?Neighbour
這篇文章主要為大家介紹了OpenCV之理解KNN鄰近算法k-Nearest?Neighbour,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-05-05
Jupyter Notebook/VSCode導(dǎo)出PDF中文不顯示的解決
這篇文章主要介紹了Jupyter Notebook/VSCode導(dǎo)出PDF中文不顯示的解決方案,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-06-06
python3多線程中使用線程睡眠的方法實(shí)現(xiàn)
線程睡眠是一個(gè)常見且有用的工具,用于控制線程的執(zhí)行順序和速度,本文主要介紹了python3多線程中使用線程睡眠的方法實(shí)現(xiàn),具有一定的參考價(jià)值,感興趣的可以了解一下2024-08-08
python3往mysql插入二進(jìn)制圖片出現(xiàn)1064錯(cuò)誤
這篇文章主要介紹了python3往mysql插入二進(jìn)制圖片出現(xiàn)1064錯(cuò)誤的解決方案,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-03-03
django channels使用和配置及實(shí)現(xiàn)群聊
本文主要介紹了django channels使用和配置及實(shí)現(xiàn)群聊,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2022-05-05
python中@property的作用和getter setter的解釋
這篇文章主要介紹了python中@property的作用和getter setter的解釋,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2020-12-12

