1. 程式人生 > >Django學習手冊 - ORM 數據表操作

Django學習手冊 - ORM 數據表操作

而是 tab mode create 列表 object primary 字典類 金庸

queryset 數據類型介紹

  QuerySet與惰性機制

  所謂惰性機制:表名.objects.all()或者.filter()等都只是返回了一個QuerySet(查詢結果集對象),它並不會馬上執行sql,而是當調用QuerySet的時候才執行

  

QuerySet特點:

<1> 可叠代的

<2> 可切片

<3> 惰性計算和緩存機制

  例:

info=models.table_name.objects.all()[0:5]  #切片
info= models.table_name.objects.all()[3]    #
索引 info= models.table_name.objects.all() #可叠代 print(info.title) for obj in info: print(obj.title)

ORM數據表 操作:

添加數據操作:

# 單表操作
    
    格式: 
    表名.objects.create()               #導入的是表
    module.表名.objects.create()   #導入的是module模塊

    添加方式一:
    models.表名.objects.create(字段1
=參數1,字段2=參數2) 添加方式二: obj=models.表名(字段1=參數1,字段2=參數2) obj.save() # 一對多表操作: 添加方式一: models.表名.objects.create(字段1=參數1,字段2=參數2,外鍵ID=參數) 添加方式二: obj=models.表名(字段1=參數1,字段2=參數2,外鍵=參數) obj.save() # 多對多表操作: 如果兩表之間存在雙向1對N關系,就無法使用外鍵來描述其關系了; 只能使用多對多的方式,新增第三張表關系描述表; book
=models.Book.objects.get(title=笑傲江湖) author1=models.Author.objects.get(name=金庸) author2=models.Author.objects.get(name=張根) book.author.add(author1,author2) 書籍和作者是多對多關系, 切記:如果兩表之間存在多對多關系,例如書籍相關的所有作者對象集合,作者也關聯的所有書籍對象集合 book=models.Book.objects.get(title=西遊記) author=models.Author.objects.get(name=吳承恩) author2 = models.Author.objects.get(name=張根) book.author.add(author,author2) #add() 添加 #clear() 清空 #remove() 刪除某個對象

更新數據操作:

示例:

格式:
 models.表名.objects.update_or_create(條件1=參數1, defaults={字段:屬性})  

示例:
 tk = username
   models.Token.objects.update_or_create(user=user, defaults={token: tk})  

找到更新 如果沒有找到創建defaults={} 中的數據

修改數據操作:

#修改方式1 update()
    格式:
    models.表名.objects.filter(字段=參數).update(字段=參數)
    示例:
    models.Book.objects.filter(id=1).update(price=3)

#修改方式2 obj.save() 
   obj = models.表名.objects.filter(字段=參數).get(字段=參數)
   obj.字段 = 參數
   obj.save()

   book_obj=models.Book.objects.get(id=1)
   book_obj.price=5
   book_obj.save()

查詢數據

查詢所有數據:
格式:
    info=models.表名.objects.all()  
返回值:
    # query_set對象集合 [對象1、對象2、.... ]

單條查詢:
   格式一:
   info=models.表名.objects.filter(字段=參數)
   返回值:
    # 取值可以為  info[0]
    # query_set對象集合 [對象1]

   格式二:
   info=models.表名.objects.get(字段=參數)
   返回值:
    # 單個對象,沒有找到會報錯

    可追加參數: .first() / .last()
    格式:
    info=models.表名.objects.filter/get(字段=參數) .first() / .last()
    返回值:
    # query_set字典集合 [{一條記錄},{一條記錄} ] 元組類型

實際操作:

from django.db import models

# Create your models here.

# 定義 外鍵:
# 格式:
# 字段 = models.ForeignKey(‘關聯表‘,to_field=‘關聯表字段‘,on_delete=models.CASCADE)
    # 可添加參數:
    # related_name=名字  #外鍵反向查找別名(方便反向查找)
        # 使用方式; obj.名字.all()
        #在寫ForeignKey字段的時候,如果想要在反向查找時不使用默認的 小寫的表名_set,就在定義這個字段的時間加related參數!
    # related_query_name 字段=別名
        # 使用方式; obj.別名.all()
        # 一張表內兩個外鍵 需要添加 related_query_name= 名字 從而識別是哪個外鍵值
# 示例:
# B11 = models.ForeignKey(‘A1‘,to_field=‘id‘,on_delete=models.CASCADE)

# 定義 多對多:
# 格式:
# 字段 = models.ForeignKey(‘關聯表‘,to_field=‘關聯表字段‘,on_delete=models.CASCADE)
    # 可添加參數:
    # through=‘UserFans‘指定第3張關系表的表名
    # through_fields    指定第3張關系表的字段
# 示例:
# m = models.ManyToManyField(‘D1‘)

class A1(models.Model):
    id = models.IntegerField(primary_key=True)
    A11 = models.CharField(max_length=20)
    A12 = models.CharField(max_length=20)
    A13 = models.CharField(max_length=20)

class B1(models.Model):
    id = models.IntegerField(primary_key=True)
    B11 = models.ForeignKey(A1,to_field=id,on_delete=models.CASCADE)
    B12 = models.CharField(max_length=20)
    B13 = models.CharField(max_length=20)

class C1 (models.Model):
    id = models.IntegerField(primary_key=True)
    m = models.ManyToManyField(D1)
    C12 = models.CharField(max_length=20)
    C13 = models.CharField(max_length=20)

class D1 (models.Model):
    id = models.IntegerField(primary_key=True)
    D12 = models.CharField(max_length=20)
    D13 = models.CharField(max_length=20)

class Userinfo(models.Model):
    nikename=models.CharField(max_length=32)
    username=models.CharField(max_length=32)
    password=models.CharField(max_length=64)
    sex=((1,),(2,))
    gender=models.IntegerField(choices=sex)
    m=models.ManyToManyField(Userinfo)

# # 單表添加數據
    # # 方式一
    # models.A1.objects.create(A11=‘A1‘,A12=‘1‘,A13=‘1‘)
    #
    # # 方式二
    # data = {‘A11‘: ‘A2‘, ‘A12‘: ‘2‘, ‘A13‘: ‘2‘}
    # models.A1.objects.create(**data)
    #
    # # 方式三
    # data2 = {‘A11‘: ‘A3‘, ‘A12‘: ‘3‘, ‘A13‘: ‘3‘}
    # obj = models.A1(**data2)
    # obj.save()

# QuerySet 數據類型:可以看作是一個列表
#   QuerySet 對象,可切片,索引,叠代

# <class ‘models.A1‘>類對象: 就是一個類
#   相當於一個類,獲取字段數值為 類.字段名

# 單表查詢數據
    # 查詢所有數據
    # obj = models.A1.objects.all()
    # print(obj) # QuerySet 對象

    # 查詢單條數據
    #方式一 filter
    # obj2 = models.A1.objects.filter(id=1)  #查詢不到數據為 空 QuerySet對象
    # print(obj2) # QuerySet 對象

        # # filter 可追加參數
        # obj21 = models.A1.objects.filter(id=1).first()  #第一條
        # obj22 = models.A1.objects.filter(id=1).last()   #最後一條
        # obj23 = models.A1.objects.filter(id=1).values_list()   #元組類型輸出
        # obj24 = models.A1.objects.filter(id=1).values()        #字典類型輸出
        # # print(type(obj21/22/23/24))  #<class ‘models.A1‘>類對象

    #方式二 get
    # obj3 = models.A1.objects.get(id=1)  #查詢不到數據報錯!!!!
    # print(obj3)
    # print(type(obj3))  #<class ‘models.A1‘>類對象

# 單表刪除數據
    # 方式一:
    # models.A1.objects.filter(id=1).delete()

    # 方式二:
    # ob1 = models.A1.objects.get(id=1)
    # ob1.delete()
    # ob1.save()

# 單表修改數據
    #方式一:
    # models.A1.objects.filter(id=3).update(A11=‘A33‘,A12=‘A33‘,A13=‘A33‘)

    # data_updata = {‘A11‘:‘A33‘,‘A12‘:‘A33‘,‘A13‘:‘A33‘}
    # models.A1.objects.filter(id=4).update(**data_updata)

    # # 方式二:
    # ob1 = models.A1.objects.get(id=3)
    # ob1.A11 = ‘A44‘
    # ob1.A12 = ‘A44‘
    # ob1.A13 = ‘A44‘
    # ob1.save()


# 一對多表操作(外鍵)
    # 一對多添加數據
    #方式一
    # data = {‘B12‘:‘B66‘,‘B13‘:‘B66‘,‘B11_id‘:3}
    # models.B1.objects.create(**data)

    #方式二
    # data = {‘B12‘:‘B55‘,‘B13‘:‘B55‘,‘B11_id‘:4}
    # obj = models.B1(**data)
    # obj.save()


    # 一對多表刪除數據(跟單表操作一樣)
    # 方式一:
    # models.B1.objects.filter(id=6).delete()

    # 方式二:
    # models.B1.objects.get(B12=‘B66‘).delete()


    # 一對多表修改數據(跟單表操作一樣)
    # models.B1.objects.filter(id=3).update(B11_id=4)


    #一對多表查詢數據(跨表查詢)
    # 一對多表 跨表查詢(正向查找 B表-外鍵字段-A表字段,下面兩句等效)
    # info = models.B1.objects.filter(id=3).first().B11
    # info2 = models.B1.objects.get(id=3).B11
    # print(info)     # A1 object (4)
    # print(info2)    # A1 object (4)

    # # 一對多表 跨表查詢(反向查找)(下面兩條結果一致)
    # #方式一(根據 類的方式查找 ) (info.小寫表名_set)
    # info = models.A1.objects.filter(id=4)
    # info1 = info.first().b1_set.values()
    # print(info1)    #values --- QuerySet類型
    # #方式二(根據values方式查找)(在values中  ‘小寫表名__字段名‘ )
    # info2 = models.A1.objects.values(‘b1__B11‘,‘b1__B12‘,‘b1__B13‘).filter(id=4)
    # print(info2)    #values --- QuerySet類型

    #多對多表操作
    #多對多表添加操作

    # 正向添加 通過 多對多字段m.add增加
    #C1表id =1 字段 關聯 D1表的 id = 1,2,3
    # obj = models.C1.objects.filter(id=1).first()
    # obj.m.add(1,2,3)

    # 反向添加 通過 小寫表名_set.add增加
    # D1表id =1 字段 關聯 C1表的 id = 1,2,3
    # obj2 = models.D1.objects.filter(id=1).first()
    # obj2.c1_set.add(1,2,3)

    #C1 id=3 關聯 D1表id>3的數據
    # obj1 = models.C1.objects.filter(id=3).first()
    # obj2 = models.D1.objects.filter(id__gt=3)
    # obj1.m.add(*obj2)


    #多對多表刪除操作
    # 正向刪除
    # obj1 = models.C1.objects.filter(id=1).first()
    # obj1.m.remove(1,2,3)

    # 逆向刪除
    # obj2 = models.D1.objects.filter(id=1).first()
    # obj2.c1_set.remove(2,3)

    # 清除數據
    # obj3 = models.C1.objects.filter(id=3).first()
    # obj3.m.clear()

    #多對多修改
    # ManyToManyField()字段 自動創建第3張關系表,可以使用字段跨表查詢,但無法直接操作第3張表,
    # obj.m.all() 只有查詢和清空 方法

    #多對多查詢
    # 正向查詢(通過多對多字段 直接查詢)
    # obj = models.C1.objects.get(id=3).m.values()
    # print(obj)

    # 反向查詢(通過.表名_set 查詢)
    # obj = models.D1.objects.get(id=1).c1_set.values_list()
    # print(obj)

#----------------------------------------------

# 多對多自關聯(由原來的3張表,變成只有2張表)
# 把兩張表通過 choices字段合並為一張表
# ‘第三張關系表’ 使用models.ManyToManyField(‘Userinfo‘)生成

    # 同表正反向查詢
    # 多對多 自關聯 通過男士查詢女生
    # boy_obj = models.Userinfo.objects.filter(id=2).first()
    # res = boy_obj.m.all()
    # for row in res:
    #     print(row.nikename)

    # # 多對多自關聯 之通過女士查詢男生
    # girl_obj = models.Userinfo.objects.filter(id=4).first()
    # res = girl_obj.userinfo_set.all()
    # for obj in res:
    #     print(obj.nikename)

Django學習手冊 - ORM 數據表操作