Django -- 單表操作
ORM簡介
1, ORM是 對象--關系--映射 的簡稱.實現了數據模型與數據庫的解耦,即數據庫的設計不需要依賴特定的數據庫,通過簡單的配置就可以輕松更換數據庫
2, 類對象 --> sql --> pymysql --> mysql服務端 --> 磁盤,orm其實就是將類對象的語法翻譯成sql語句的一個引擎

建表操作
1, 創建表
# app 應用下的 models.py 文件中寫 from django.db import models class UserInfo(models.Model): # UserInfo 為表名 id = models.AutoField(primary_key=True) name = models.CharField(max_length=10) age = models.IntegerField() current_date = models.DateField()
2, 更多字段和參數
字段
<1> CharField 字符串字段, 用于較短的字符串. CharField 要求必須有一個參數 max_length, 用于從數據庫層和Django校驗層限制該字段所允許的最大字符數. <2> IntegerField 用于保存一個整數. <3> DecimalField 一個浮點數. 必須 提供兩個參數: <4> AutoField 一個 IntegerField, 添加記錄時它會自動增長. 你通常不需要直接使用這個字段; 自定義一個主鍵:my_id=models.AutoField(primary_key=True) 如果你不指定主鍵的話,系統會自動添加一個主鍵字段到你的 model.
(1)null 如果為True,Django 將用NULL 來在數據庫中存儲空值。 默認值是 False. (1)blank 如果為True,該字段允許不填。默認為False。 要注意,這與 null 不同。null純粹是數據庫范疇的,而 blank 是數據驗證范疇的。 如果一個字段的blank=True,表單的驗證將允許該字段是空值。如果字段的blank=False,該字段就是必填的。 (2)default 字段的默認值。可以是一個值或者可調用對象。如果可調用 ,每有新對象被創建它都會被調用,如果你的字段沒有設置可以為空,那么將來如果我們后添加一個字段,這個字段就要給一個default值 (3)primary_key 如果為True,那么這個字段就是模型的主鍵。如果你沒有指定任何一個字段的primary_key=True, Django 就會自動添加一個IntegerField字段做為主鍵,所以除非你想覆蓋默認的主鍵行為, 否則沒必要設置任何一個字段的primary_key=True。 (4)unique 如果該值設置為 True, 這個數據字段的值在整張表中必須是唯一的 (5)choices 由二元組組成的一個可迭代對象(例如,列表或元組),用來給字段提供選擇項。 如果設置了choices ,默認的表單將是一個選擇框而不是標準的文本框,<br>而且這個選擇框的選項就是choices 中的選項。 (6)db_index 如果db_index=True 則代表著為此字段設置數據庫索引。 ? DatetimeField、DateField、TimeField這個三個時間字段,都可以設置如下屬性。 ? (7)auto_now_add 配置auto_now_add=True,創建數據記錄的時候會把當前時間添加到數據庫。 ? (8)auto_now 配置上auto_now=True,每次更新數據記錄的時候會更新該字段,標識這條記錄最后一次的修改時間
3, settings配置
若想將模型轉為mysql數據庫中的表,需要在 settings.py 中配置:
DATABASES = { 'default': { 'ENGINE': 'django.db.backends.mysql', 'NAME':'庫名', 'USER':'root', 'PASSWORD':'666', 'HOST':'127.0.0.1', 'PORT':3306 } } ? # 打印sql語句 LOGGING = { 'version': 1, 'disable_existing_loggers': False, 'handlers': { 'console':{ 'level':'DEBUG', 'class':'logging.StreamHandler', }, }, 'loggers': { 'django.db.backends': { 'handlers': ['console'], 'propagate': True, 'level':'DEBUG', }, } }
項目文件夾下的 init.py文件中,寫下面兩句
import pymysql pymysql.install_as_MySQLdb()
執行數據庫同步指令
python manage.py makemigrations # 生成記錄,每次修改了models里面的內容或者添加了新的app,新的app里面寫了models里面的內容,都要執行這兩條 ? python manage.py migrate # 執行上面這個語句的記錄來創建表,生成的表名字前面會自帶應用的名字,例如:你的book表在mysql里面叫做app01_book表
增加數據
已建好的表數據(model.py) :
from django.db import models ? class Data(models.Model): name = models.CharField(max_length=10) age = models.IntegerField() current_data = models.DateField() ? def __str__(self): return self.name
1, 創建方式一:
from app import models student_obj = models.Data( name = 'alex', age = 73, current_data= '2008-08-08' ) student_obj.save()
2, 創建方式二(常用此創建):
from app import models new_obj = models.Data.objects.create( name = 'wusir', age = 83, current_data= '2008-08-15', ) ? print(new_obj) # Data object --> model對象 print(new_obj.name,new_obj.age) # .屬性 可以獲取對應字段的數據
3, 創建方式三
from app import models lis = [] for i in range(10): obj = models.Data( name = 'xin', age = 18, current_data= '2010-10-10' ) lis.append(obj) models.Data.objects.bulk_create(lis) # 批量插入,速度快
4, 創建方式四: update_or_create 有就更新,沒有就創建
from app import models models.Data.objects.update_or_create( name = 'taibai', # 有就更新 defaults={'age':89,'current_data':'2011-11-11'} ? name = 'xuefei', # 沒有就創建 defaults={'age':18,'current_data':'2000-08-08'} )
查詢數據
1, 簡單查詢
# all() 查詢所有的數據,返回的是queryset集合 all_objs = models.Data.objects.all() print(all_objs) for i in all_objs: print(i.name) # 拿到每一個名字 ? # 條件查詢: filter()方法, 返回的也是queryset集合,查詢不到內容不會報錯,返回一個<QuerySet []>空的queryset objs = models.Data.objects.filter(id=15) print(objs[0].name,objs[1].age) # 通過索引.字段取值 ? objs = models.Data.objects.filter(id=1,name='alex').update(name='eva',age=20) print(objs) ? 打散的形式傳參 objs = models.Data.objects.filter(**{'id':15,'name':'xuefei'}) print(objs) ? # 條件查詢 : get()方法,返回的是model對象,而且get方法有且必須只有一個結果 objs = models.Data.objects.get(id=15) print(objs) 查詢的數據不存在會報錯,得到的結果有兩個時會報錯 ? # exclude(**kwargs):排除的意思,包含了與所給篩選條件不匹配的對象,沒有不等于操作, objects控制器和queryset集合都可以調用,返回值是queryset類型. ex = models.Data.objects.exclude(name='xin') ex = models.Data.objects.all().exclude(name='xin') print(ex) ? # order_by(): queryset類型的數據來調用,查詢結果進行排序,默認是按照id的升序排序的,返回值還是queryset類型,在字段前面加個 - 號,就是降序排序 ord = models.Data.objects.order_by('-age','id') # 多條件排序,按照age進行降序,age相同的按照id升序排序 print(ord) ? # reverse() : queryset類型的數據來調用,對查詢結果反向排序,返回值還是queryset類型 rev = models.Data.objects.order_by('id').reverse() print(rev) ? # count() : queryset類型的數據來調用,返回數據庫中匹配查詢(QuerySet)的對象數量。 con = models.Data.objects.all().count() print(con) ? # first() : queryset類型的數據來調用,返回第一條記錄,得到的都是model對象 obj = models.Data.objects.all().first() print(obj) ? # last(): queryset類型的數據來調用,返回最后一條記錄,結果為model對象類型 obj = models.Data.objects.all().last() print(obj) ? # exists() : queryset類型的數據來調用,如果QuerySet包含數據,就返回True,否則返回False,空的queryset類型數據也有布爾值True和False,但是一般不用它來判斷數據庫里面是不是有數據,如果有大量的數據,你用它來判斷,那么就需要查詢出所有的數據,效率太差了,用count或者exits ? # values(*field) : 用的比較多,queryset類型的數據來調用,返回一個ValueQuerySet——一個特殊的QuerySet,運行后得到的并不是一系列,model的實例化對象,而是一個可迭代的字典序列,只要是返回的queryset類型,就可以繼續鏈式調用queryset類型的其他的查找方法,其他方法也是一樣的。 # values_list(*field): 它與values()非常相似,它返回的是一個元組序列 obj = models.Data.objects.all().filter(age=16).values('name','age') print(obj) obj = models.Data.objects.all().filter(age=16).values_list('name','age') print(obj) ? # distinct(): values和values_list得到的queryset類型的數據來調用,從返回結果中剔除重復紀錄,結果還是queryset query = models.Data.objects.all().values('age').distinct() print(query)
2, 基于雙下劃線的模糊查詢
mes = models.Data.objects.filter(price__in=[100,200,300]) # price值等于這三個里面的任意一個的對象 ? mes = models.Data.objects.filter(price__gt=100) # 大于,大于等于是price__gte=100,別寫price>100,這種參數不支持 ? mes = models.Data.objects.filter(price__lt=100) # 小于 ? mes = models.Data.objects.filter(price__range=[100,200]) # sql的between and,大于等于100,小于等于200 ? mes = models.Data.objects.filter(title__contains="python") #title值中包含python的 ? mes = models.Data.objects.filter(title__icontains="python") #不區分大小寫 ? mes = models.Data.objects.filter(title__startswith="py") #以什么開頭,istartswith 不區分大小寫 ? all_books = models.Book.objects.filter(pub_date__year=2012) #找2012年的所有書籍 ? all_books = models.Book.objects.filter(pub_date__year__gt=2012) # 找大于2012年的所有書籍 ? all_books = models.Book.objects.filter(pub_date__year=2019,pub_date__month=2) #找2019年月份的所有書籍
刪除數據
delete queryset 和model對象都可以調用 ? models.Student.objects.get(id=3).delete() # model對象來調用的delete方法 models.Student.objects.filter(name='Alex').delete() models.Student.objects.all().delete() # 刪除所有
更改數據
model對象不能調用更新方法 報錯信息'Student' object has no attribute 'update' 只能queryset調用 ? models.Student.objects.get(name='alex').update(age=38) # 報錯 models.Student.objects.filter(name='alex').update(age=38)


浙公網安備 33010602011771號