Django 07模型层—单表操作(增删改查)
生活随笔
收集整理的這篇文章主要介紹了
Django 07模型层—单表操作(增删改查)
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
單表查詢
一.數據庫相關設置
''' # Mysql連接配置 DATABASES = {'default': {'ENGINE': 'django.db.backends.mysql','NAME': 'db_name','HOST': '127.0.0.1','USER': 'root','PASSWORD': 'root'} }# 配置ORM的loggers日志 LOGGING = {'version': 1,'disable_existing_loggers': False,'handlers': {'console': {'level': 'DEBUG','class': 'logging.StreamHandler',},},'loggers': {'django.db.backends': {'handlers': ['console'],'propagate': True,'level': 'DEBUG',},} } '''''' class User(models.Model):id = models.AutoField(primary_key=True)name = models.CharField(max_length=16)age = models.IntegerField()birthday = models.DateField() '''二、測試文件運行Django項目
''' 1. 加載項目配置文件 import os os.environ.setdefault("DJANGO_SETTINGS_MODULE", "項目名.settings") 2. 啟動Django import django django.setup() 3. 使用項目中的各個模塊 from my_app.models import User '''三、簡單增刪改查
Django的Queryset和objects對象
''' 1. QuerySet是查詢集,就是傳到服務器上的url里面的內容。Django會對查詢返回的結果集QerySet進行緩存,這里是為了提高查詢效率。也就是說,在你創建一個QuerySet對象的時候,Django并不會立即向數據庫發出查詢命令,只有在你需要用到這個QuerySet的時候才回去數據庫查詢。2. Objects是django實現的mvc框架中的數據層,django中的模型類都有一個objects對象,它是一個django中定義的QuerySet類型的對象,它包含了模型對象的實例。簡單的說,Objects是單個對象,QuerySet是許多對象。QuerySet 可以被構造,過濾,切片,做為參數傳遞,這些行為都不會對數據庫進行操作。只要你查詢的時候才真正的操作數據庫。 '''1、增
''' User.objects.create(name='henry',age='30',birthday='1989-10-13')user = User(name='wendy',age='25',birthday='1994-8-28') user.save() '''2、查
''' # 操作的結果是一個list,類型是queryset u_list = User.objects.filter(name='henry')# 只能操作有且只有一條數據的記錄 user = User.objects.get(id=1)try:u2 = User.objects.get(name='wendy')print(u2) except Exception:print('wendy對象不唯一!') '''3、改
''' User.objects.filter(id=2).update(birthday='1994-10-3')user=User.objects.filter(name='wendy')[0] user.birthday = '1994-8-28' user.save() '''4、刪
''' User.objects.filter(id=1).delete()user = User.objects.filter(name='wendy')[0] user.delete() '''四、單表操作函數
''' 1. all():查詢所有結果list,類型是QuerySet,支持正向索引取值[i],支持索引切片[m:n] QuerySet對象具有query屬性,里面存放的的是得到該結果執行的sql語句(ORM內部還存在對sql語句的優化) 支持正向索引(不支持反向索引,原因是數據過多時,不能將數據一次性查出,需要分批次按需求查出) u_l=User.objects.all()[1:3] 得到索引為1,2的兩條數據2. filter(**kwargs):查詢結果是一個包含滿足條件的所有數據的列表,類型為QuerySet 3. get(**kwargs):查詢滿足條件的唯一對象obj,查詢結果不為obj則拋出異常 4. exclude(**kwargs):查詢結果是一個包含滿足條件的對立面的所有數據的列表,類型為QuerySet5. order_by(*field):查詢按照指定字段進行排序后的所有結果,返回值是一個list,類型為QuerySet,'tag_name'代表正序,'-tag_name'代表降序 User.objects.order_by('id') #按照id正序排序 User.objects.order_by('-id') #按照id降序排序6. reverse():反轉排序查詢的所有結果,返回值為一個list User.objects.order_by('id').reverse()7. count():統計返回查詢結果list的長度 count = User.objects.all().count()8. first():返回查詢結果中的第一個對象obj9. last():返回查詢結果中的最后一個對象obj10. exists():判斷查詢結果是否存在,值為布爾類型 res = User.objects.filter(id=6).exists() print(res)11. values(*field):按照指定字段(們)進行查詢,返回存放包含字段(們)的字典類型的列表list u_l5_dic = User.objects.values('id','name') print(u_l5_dic) 結果:<QuerySet [{'id': 1, 'name': 'henry'}, {'id': 2, 'name': 'wendy'}>12. values_list(*field):與values(*field)類似,但返回值是存放數據的元組類型的列表list u_l6 = User.objects.values_list('id','name') print(u_l6) 結果:<QuerySet [(1, 'henry'), (2, 'wendy')]>13. distinct():從查詢結果中剔除重復字段(一般和values結合使用),不能對數據庫進行去重操作,只是在結果中剔除了重復的字段 u_17 = User.objects.values('name','age','birthday').distinct() print(u_17) ''' ''' 配置ORM的loggers日志 print(user_list) #得到的sql語句是經過ORM框架優化后的sql語句,是真正交給pymysql執行的sql語句 print(user_list.query) #結果是將這個對象轉化為sql語句的初步sql '''五、模糊查詢
''' user_list = User.objects.filter(id__gte=1)# 整型相關 age__exact=8 # 確切匹配8 age__in=[8, 10] # 8或10 age__gt=8 # 大于8 age__gte=8 # 大于等于8 age__lt=8 # 小于8 age__lte=8 # 小于等于8 age__range=[8, 10] # 8到10之間age__isnull=0|1 u_111 = User.objects.filter(id__isnull=1) # 1:該字段為空的所有數據 | 0:該字段不為空的所有數據# 字符串相關 name__startswith # 后方模糊匹配 u_l12 = User.objects.filter(name__startswith='s') print(u_l12)name__endswith # 前方模糊匹配 u_l13 = User.objects.filter(name__endswith='y') print(u_l13)name__contains # 前后方均模糊匹配 u_l14 = User.objects.filter(name__contains='n') print(u_l14)name__regex # 正則匹配 u_l15 = User.objects.filter(name__regex="n{1,}") #名字中含有一個或多個n print(u_l15) 在這里正則匹配不能用\w代表所有字母數字,這樣會被解析成是否含有\w這個字符,而是要用[a-zA-Z0-9]代替 u_l16 = User.objects.filter(name__iregex="[a-zA-Z0-9]{1,}") #名字中含有一個或多個字符 print(u_l16)name__istartswith # 不區分大小寫后方模糊匹配(i開頭就是不區分大小寫) u_l17 = User.objects.filter(name__istartswith='s') print(u_l17)# 時間相關 birthday__year=2008 # 時間年份模糊匹配 u_l18 = User.objects.filter(birthday__year=1989) print(u_l18) '''六、F與Q查詢
''' from django.db.models import F, Q # F基于計算 F('字段名') # 案例一:將id為1的結果年齡增加1 User.objects.filter(id=1).update(age=F('age')+1) #age=age+1 是錯誤的,update不能完成二步操作# 案例二:查詢id是年齡1/4的結果 user = User.objects.filter(id=F('age')/6)#>> 與 << print(8>>1) => 4 print(8<<1) => 16# Q基于關系 Q('字段條件') u_l19 = User.objects.filter(name__regex='henry',age=30) #默認是與關系 & print(u_l19) # 與 & User.objects.filter(Q(id=1) & Q(age=30)) # id=1 并且 age=30# 或 | User.objects.filter(Q(id=1) | Q(id=2)) # id=1 或 id=2 User.objects.filter(Q(age__lt=20) | Q(name__icontains='a')) #年齡小于20或姓名包含a# 非 ~ User.objects.filter(~Q(id=1)) # id 不為 1 User.objects.filter(~Q(age__lte=25)) #年齡不小于等于25'''轉載于:https://www.cnblogs.com/liubinliuliu/p/10532680.html
總結
以上是生活随笔為你收集整理的Django 07模型层—单表操作(增删改查)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 我国002航母海试?
- 下一篇: 微信小程序无法获取UnionId的情况及