Django進階 1.1 ORM基礎—ORM 1.2.1 增刪改查之查詢 1.2.2 刪改增 (1) 1.2.3 刪改增 (2)

ORM基礎

ORM是Django操做數據庫的API,Django的做者將sql語句封裝在裏面供咱們使用。mysql

咱們前面還提到過Django提供一個模擬數據庫的工具,sqlite,供咱們學習測試使用。sql

若是咱們想使用mysql,須要在setting中更改database選項,修改數據庫

DATABASES = {
	'default': {
		'ENGINE': 'django.db.backends.mysql', 
		'NAME': 'books',    #你的數據庫名稱
		'USER': 'root',   #你的數據庫用戶名
		'PASSWORD': '', #你的數據庫密碼
		'HOST': '', #你的數據庫主機,留空默認爲localhost
		'PORT': '3306', #你的數據庫端口
	}
}

而後修改__init__文件 寫入 import pymysql pymysql.install_as_MySQLdb()django

以前說過,在數據庫中建立表的時候就是在modules中建立類json

一些類型

class School(models.Model): name = models.CharField(max_length=32,blank=True,verbose_name='名稱') mac = models.URLField(max_length=32,blank=True,verbose_name='名稱') ## URL 類型(其實數據類型都是同樣的,不過django在處理的時候會作一些判斷) mail = models.EmailField(max_length=32,blank=True,verbose_name='郵箱') yes_no = models.BooleanField(max_length=32,blank=True,verbose_name='是否') date = models.DateField(default="",verbose_name="日期") num = modelsIntegerField(default="",verbose_name="日期")函數

One to One

class Number(models.Model): models.OneToOneField(to='UserInfo',verbose_name="學號")工具

學號可能和userinfo是一一對應的的關係,那麼咱們能夠把他們寫成onetoone ,其實也能夠直接把他寫進userinfo的表裏性能

一對多

cla = models.ForeignKey(to='Class')   #會連接表(根據生成的ID)

多對多

models.ManyToManyField(to='UserInfo')

這種會在數據庫中生成新的表,記錄ID學習

class UserInfo(models.Model): username=models.CharField(max_length=32,null=True) password=models.CharField(max_length=32,null=True) def str(self): return self.username ##這樣能夠直接返回username的內容,在後面的ORM的查詢中很方便測試

1.2 增刪改查

查詢全部的數據

咱們先在views中修改以前的test函數

def test(request):
	dic = {'a':1,'b':2}
	dic_json = json.dumps(dic)
	school_li = models.School.objects.all()  ## 會返回一個列表
	for item in school_li:
		print (school_li)  ## 咱們在models的School類中定義了一個函數 __str__,咱們能夠經過這個來發現它的做用,直接打印school_li就能夠打印結果
		print (item,type(item))
	return HttpResponse(dic_json)

查詢單條數據

school = models.School.objects.get(id=1)
	print (school,type(school),school.name)

不知道查詢幾條數據

obj = models.School.objects.filter(name='No.1school')
print (obj)

obj = models.School.objects.filter(name='No.1school').first() ##第一個值
obj = models.School.objects.filter(name='No.1school').last()  ##最後一個值

檢索的時候有get和filter兩種方法,推薦使用filter,當get查不到值的時候會報錯,可是filter會返回空的QuerySet list

傳入字典變量

dic = {'name':'No.1school'}
obj = models.School.objects.filter(**dic).first()
print (obj)

dic1 = {'name':'New_school'}
obj = models.School.objects.create(**dic1)
print (obj,type(obj),obj.name)

刪除

刪除實際上是基於filter來實現的,能夠查完對返回的對象進行刪除操做 dic = {'name':'No.1school'} obj = models.School.objects.filter(**dic).first() obj.delete()

也能夠直接這樣

dic1 = {'name':'New_school'}
obj = models.School.objects.filter(**dic1).delete()
print (obj,type(obj))

咱們新建了兩張表

(2, {'Django111.School': 2}) <class 'tuple'>

返回的是一個元組,第一個值是刪除的條數,第二個是屬於哪一個類,刪除的條數

dic1 = {'name':'New_school'}
dic2 = {'name':'New_school2'}
obj = models.School.objects.filter(**dic2).update(**dic1)
print(obj,type(obj))

get方法

會返回修改次數,數據類型是int

除此以外能夠用get的方式

使用方法和filter相似

dic = {'name':'No.1school'}
obj = models.School.objects.get(**dic)
obj.name="New_No.1school"
obj.save()
print(obj,type(obj))

>>>
New_No.1school <class 'Django111.models.School'>

get方法的性能會比filter略差,且查不到值的時候會報錯,因此咱們在修改數據的時候推薦使用filter方法

相關文章
相關標籤/搜索