1. 程式人生 > 實用技巧 >Django學習4

Django學習4

ORM單表操作

類 --- 表
類物件 --- 一行資料
類屬性 --- 欄位

#建立記錄方式一
student_obj = models.Student(
    name='大壯',
    age=48,
)
student_obj.save()

#建立記錄方式二
models.Student.objects 物件控制器
new_obj = models.Student.objects.create(name='雪飛',age=18)	#也可寫成**{'name':'雪飛','age':18}
print(new_obj)        # Student object -- model物件  .屬性可以獲取對應欄位的資料
print(new_obj.name)  # 雪飛
print(new_obj.age)  # 18

#建立記錄方式三 -- 批量建立1
objs = []
for i in range(20):
    obj = models.Student(
        name='玉溪%s'%i,
        age=10+i,
    )
    objs.append(obj)
models.Student.objects.bulk_create(objs)

#建立記錄方式四 -- 批量建立2 update_or_create
models.Student.objects.update_or_create(
    name = '雙喜',
    defaults={
        'age':26
    }
)

# 新增日期資料
# 方式一 datetime.datetime物件
import datetime
current_date = datetime.datetime.now()
models.Birthday.objects.create(name='小智',date=current_date)
# 方式二 字串
models.Birthday.objects.create(name='路比',date='2000-6-18')

#刪除 delete
models.Student.objects.get(id=1).delete()   # 用model物件呼叫delete方法(get方法返回的是model物件)
models.Student.objects.filter(name='阿強').delete()   # 用queryset物件也可呼叫delete方法
models.Student.objects.all().delete()   # 刪除所有資料

#更新
models.Student.objects.get(name='阿強').update(age=30)    # model物件沒有更新方法 報錯資訊:'Student' object has no attribute 'update'
models.Student.objects.filter(name='阿強').update(age=30)   # 只能queryset物件呼叫

查 (簡單)

簡單查詢(三劍客 all filter get)
1.查詢所有的資料  .all方法  返回的是QuerySet集合
all_objs = models.Student.objects.all()
# print(all_objs)   # <QuerySet [<Student: Student object>, <Student: Student object>, <Student: Student object>]> -- 類似於列表 -- queryset集合
# for i in all_objs:
#     print(i.name)   # 小智 小霞 小剛

    print(all_objs)  # < QuerySet[ < Student: 小智 >, < Student: 小霞 >, < Student: 小剛 >] >(改寫了__str__)

2.條件查詢  .filter方法  返回的是QuerySet集合,查詢不到內容不會報錯,返回<QuerySet []>
objs = models.Student.objects.filter(id=3)  # 找id為3的記錄
print(objs)     # <QuerySet [<Student: 小剛>]>

3.條件查詢  .get方法  返回的是model物件!而且get方法有且必須只有一個結果,否則報錯(為空或者多了)!
objs = models.Student.objects.get(id=3)  # 找id為3的記錄
print(objs)     # 小剛

查詢介面

<1> all():                  查詢所有結果,結果是queryset型別

<2> filter(**kwargs):	   查詢與所給篩選條件相匹配的物件,結果是queryset型別
    #多條件
    models.Student.objects.filter(id=7,name='吳尊').update(name='無極尊',age=27,)
    #打散形式傳參
    models.Student.objects.filter(**{'id':7,'name':'無極尊'}).update(age=100,)
    #queryset型別可以呼叫filter再過濾
    models.Student.objects.all().filter(id=7)

<3> get(**kwargs):          返回與所給篩選條件相匹配的物件,model物件,返回結果有且只有一個,否則報錯
    
<4> exclude(**kwargs):	   排除符合條件的物件  object控制器和queryset集合都可以呼叫,返回結果是queryset型別
    object控制器呼叫:
    query = models.Student.objects.exclude(id=3)
    QuerySet物件呼叫:
    query = models.Student.objects.filter(age=26).exclude(id=24)

<5> order_by(*field):    	queryset型別的資料來呼叫,對查詢結果排序,返回值還是queryset型別
    query = models.Student.objects.all().order_by('age','-id')  # 按age升序排,age相同的時候按id降序排
  
<6> reverse():              queryset型別的資料來呼叫,在排序的結果基礎上反向排序,返回值還是queryset型別
    query = models.Student.objects.all().order_by('id').reverse()
    
<7> count():			   	queryset型別的資料來呼叫,返回資料庫中匹配查詢(QuerySet)的物件數量(數字)。
    num = models.Student.objects.all().count()
    
<8> first(): 			   	queryset型別的資料來呼叫,返回第一條記錄,結果為model物件
<9> last():					queryset型別的資料來呼叫,返回最後一條記錄,結果為model物件
   
<10> exists():				queryset型別的資料來呼叫,如果QuerySet包含資料,就返回True,否則返回False
    obj = models.Student.objects.all().filter(name='無極尊').exists()
    if obj:print(obj)
    else:print('nothing...')
    
<11> values(*field):		返回裡面是字典的queryset型別(一個字典就是一行資料,字典的鍵就是欄位)
    query = models.Student.objects.filter(age=26).values()
    print(query)    # <QuerySet [{'id': 24, 'name': '相璽16', 'age': 26}, {'id': 28, 'name': '文洋', 'age': 26}]>
    # values可以指定欄位
    query = models.Student.objects.filter(age=26).values('name','age')
    
<12> values_list(*field): 	返回裡面是元組的queryset型別(一個元組就是一行資料,元組裡面的每一項對應一個欄位)
    query = models.Student.objects.filter(age=26).values_list()
    print(query)    # <QuerySet [(24, '相璽16', 26), (28, '文洋', 26)]>
    # values_list也可以指定欄位
    query = models.Student.objects.filter(age=26).values_list('name','age')
    
<13> distinct(): 		values和values_list得到的queryset型別的資料來呼叫,從返回結果中剔除重複紀錄,返回結果還是queryset型別
    models.Student.objects.all().values('age').distinct()
    

基於雙下劃線的模糊查詢

# __ 找id>7的
query = models.Student.objects.filter(id__gt=7)
# __ 找id>=7的
query = models.Student.objects.filter(id__gte=7)
# 找id<7的
query = models.Student.objects.filter(id__lt=7)
# 找id<=7的
query = models.Student.objects.filter(id__lte=7)

# in
query = models.Student.objects.filter(id__in=[7, 8, 9])  # id值等於這三個裡面的任意一個的物件

# 範圍  相當於between...and...
query = models.Student.objects.filter(id__range=[5,10])  # id值在[5,10]內的

# 找name欄位裡有'相璽'的物件,只適用於字串型別的欄位
query = models.Student.objects.filter(name__contains='相璽')

# contains基礎上 + 不區分大小寫
query = models.Student.objects.filter(name__icontains='python')

# 找name欄位以'相'開頭的物件, istartswith 不區分大小寫
query = models.Student.objects.filter(name__startswith='相')

# 找name欄位以'飛'結尾的物件, iendswith 不區分大小寫
query = models.Student.objects.filter(name__endswith='飛')

# 日期結合__查詢:
# 找出生年為2000,月為07月的
query = models.Birthday.objects.filter(date__year='2000',date__month='07')
# 找出生年為2000,月為07月,日大於10的
query = models.Birthday.objects.filter(date__year='2000',date__month='07',date__day__gt='10')

# 以此類推......