黄色网页视频 I 影音先锋日日狠狠久久 I 秋霞午夜毛片 I 秋霞一二三区 I 国产成人片无码视频 I 国产 精品 自在自线 I av免费观看网站 I 日本精品久久久久中文字幕5 I 91看视频 I 看全色黄大色黄女片18 I 精品不卡一区 I 亚洲最新精品 I 欧美 激情 在线 I 人妻少妇精品久久 I 国产99视频精品免费专区 I 欧美影院 I 欧美精品在欧美一区二区少妇 I av大片网站 I 国产精品黄色片 I 888久久 I 狠狠干最新 I 看看黄色一级片 I 黄色精品久久 I 三级av在线 I 69色综合 I 国产日韩欧美91 I 亚洲精品偷拍 I 激情小说亚洲图片 I 久久国产视频精品 I 国产综合精品一区二区三区 I 色婷婷国产 I 最新成人av在线 I 国产私拍精品 I 日韩成人影音 I 日日夜夜天天综合

python 之 Django框架(orm單表查詢(xún)、orm多表查詢(xún)、聚合查詢(xún)

系統(tǒng) 2061 0
12.329 orm單表查詢(xún)
            
              import
            
            
               os

            
            
              if
            
            
              __name__
            
             == 
            
              '
            
            
              __main__
            
            
              '
            
            
              :
    
            
            
              #
            
            
               指定當(dāng)前py腳本需要加載的Django項(xiàng)目配置信息
            
            
    os.environ.setdefault(
            
              "
            
            
              DJANGO_SETTINGS_MODULE
            
            
              "
            
            , 
            
              "
            
            
              orm_demo.settings
            
            
              "
            
            
              )
    
            
            
              import
            
            
               django
    django.setup()          
            
            
              #
            
            
               啟動(dòng)Django項(xiàng)目
            
            
              from
            
             app01 
            
              import
            
            
               models
    

            
            
              #
            
            
              返回QuerySet對(duì)象的方法:
            
            
    ret =
            
               models.Book.objects.all()  
    
            
            
              print
            
            (ret)                      
            
              #
            
            
               QuerySet類(lèi)型:書(shū)籍對(duì)象的列表
            
            
              ?
    ret 
            
            = models.Book.objects.filter(title=
            
              "
            
            
              圍城
            
            
              "
            
            )  
            
              #
            
            
               QuerySet類(lèi)型  --> 書(shū)籍對(duì)象的列表
            
            
              #
            
            
               id值大于1
            
            
    ret = models.Book.objects.filter(id__gt=1
            
              )  
    
            
            
              #
            
            
               id值小于3
            
            
    ret = models.Book.objects.filter(id__lt=3
            
              ) 
    
            
            
              #
            
            
               出版日期是2017年的書(shū)
            
            
    ret = models.Book.objects.filter(publisher_date__year=2017
            
              )  
    
            
            
              #
            
            
               出版日期大于2017年
            
            
    ret = models.Book.objects.filter(publisher_date__year__gt=2017
            
              )  
    
            
            
              #
            
            
               書(shū)名中包含'曌'的書(shū)
            
            
    ret = models.Book.objects.filter(title__contains=
            
              "
            
            
            
              "
            
            
              ) 
    
            
            
              #
            
            
               書(shū)名中包含'曌'的書(shū)并且出版年份是2018年
            
            
    ret = models.Book.objects.filter(title__contains=
            
              "
            
            
            
              "
            
            , publisher_date__year=2018
            
              )  
?
    
            
            
              #
            
            
               get方法如果符合篩選條件的對(duì)象超過(guò)一個(gè)或者沒(méi)有都會(huì)拋出錯(cuò)誤。
            
            
              #
            
            
              符合篩選條件的對(duì)象只有一個(gè),則返回具體的類(lèi)對(duì)象實(shí)例:書(shū)籍對(duì)象,而不是列表
            
            
    ret = models.Book.objects.get(id=10
            
              )  
    
            
            
              print
            
            (ret)                          
            
              #
            
            
              報(bào)錯(cuò)
            
            
              #
            
            
               使用filter檢索的時(shí)候沒(méi)有滿(mǎn)足條件的數(shù)據(jù)就返回一個(gè)空 QuerySet
            
            
    ret = models.Book.objects.filter(id=10
            
              )  
    
            
            
              print
            
            (ret)                          
            
              #
            
            
              []
            
            
              ?
    
            
            
              #
            
            
               將滿(mǎn)足條件的去掉,留下不滿(mǎn)足條件的
            
            
    ret = models.Book.objects.exclude(id__in=[1,3,4
            
              ])
    
            
            
              print
            
            
              (ret)
    
            
            
              #
            
            
               按字段排序
            
            
    ret = models.Book.objects.all().order_by(
            
              "
            
            
              price
            
            
              "
            
            )  
            
              #
            
            
               QuerySet類(lèi)型:根據(jù)price字段對(duì)所有數(shù)據(jù)排序
            
            
    ret = models.Book.objects.all().order_by(
            
              "
            
            
              -price
            
            
              "
            
            
              )  
    
            
            
              #
            
            
              反轉(zhuǎn)
            
            
    ret = models.Book.objects.all().order_by(
            
              "
            
            
              price
            
            
              "
            
            
              ).reverse()  
    
            
            
              #
            
            
               按照出版時(shí)間排序后反轉(zhuǎn)再去字段值  # QuerySet類(lèi)型:字段及字段值的字典的列表
            
            
    ret = models.Book.objects.all().order_by(
            
              "
            
            
              publisher_date
            
            
              "
            
            ).reverse().values(
            
              "
            
            
              title
            
            
              "
            
            
              )  
      

            
            
              #
            
            
              特殊的QuerySet:
            
            
              #
            
            
              values() 取字段的值,以字典返回
            
            
    ret = models.Book.objects.filter(publisher_date__year=2018).values(
            
              "
            
            
              title
            
            
              "
            
            , 
            
              "
            
            
              publisher_date
            
            
              "
            
            
              ) 
    
            
            
              print
            
            (ret)          
            
              #
            
            
               QuerySet類(lèi)型:字段及字段值的字典的列表
            
            
              #
            
            
              values_list() 取字段的值,以元組返回
            
            
    ret = models.Book.objects.filter(publisher_date__year=2018).values_list(
            
              "
            
            
              title
            
            
              "
            
            , 
            
              "
            
            
              publisher_date
            
            
              "
            
            )        
            
              #
            
            
               QuerySet類(lèi)型:字段值的元祖的列表
            
            
              #
            
            
               連表查詢(xún)
            
            
    ret = models.Book.objects.all().values(
            
              "
            
            
              publisher__name
            
            
              "
            
            
              ).distinct()  
    
            
            
              print
            
            (ret)           
            
              #
            
            
               QuerySet類(lèi)型:字段及字段值的字典的列表,并去重
            
            
              ?

            
            
              #
            
            
              返回?cái)?shù)字的方法
            
            
              #
            
            
               count 計(jì)數(shù)
            
            
    ret = models.Book.objects.all().count()  
            
              #
            
            
               數(shù)字:結(jié)果集中數(shù)據(jù)的個(gè)數(shù)   
            
            
              
#
            
            
              返回具體對(duì)象
            
            
              #
            
            
              first()和last()
            
            
    ret = models.Book.objects.all().first()  
            
              #
            
            
              結(jié)果集中的第一個(gè)對(duì)象
            
            
              #
            
            
              get()
            
            
    ret = models.Book.objects.get(id=1)      
            
              #
            
            
              返回匹配到的對(duì)象,有且僅有一個(gè)
            
            
              
#
            
            
              返回布爾值的方法
            
            
              #
            
            
               判斷結(jié)果集中是否有數(shù)據(jù)
            
            
    ret = models.Book.objects.all().exists()  
            
              #
            
            
               布爾值:結(jié)果集中是否有數(shù)據(jù)
            
          
12.3210 orm多表查詢(xún)(方式二)

ForeignKey操作: 書(shū)籍表(Book表)外鍵關(guān)聯(lián)出版社表(Publisher表)

正向查找:

            1
            
              .基于對(duì)象(子查詢(xún))
book_obj 
            
            = models.Book.objects.first()    
            
              #
            
            
               第一本書(shū)對(duì)象
            
            
              print
            
            (book_obj.publisher)                
            
              #
            
            
               得到這本書(shū)關(guān)聯(lián)的出版社對(duì)象
            
            
              print
            
            (book_obj.publisher.name)            
            
              #
            
            
               得到出版社對(duì)象的名稱(chēng)
            
            
2
            
              .基于雙下劃線字段方法(聯(lián)表查詢(xún))

            
            
              print
            
            (models.Book.objects.values_list(
            
              "
            
            
              publisher__name
            
            
              "
            
            ))
          

反向查找:

            1
            
              .基于對(duì)象(子查詢(xún))
publisher_obj 
            
            = models.Publisher.objects.first()   
            
              #
            
            
               找到第一個(gè)出版社對(duì)象
            
            
books = publisher_obj.book_set.all()              
            
              #
            
            
               找到第一個(gè)出版社出版的所有書(shū)籍對(duì)象
            
            
titles = books.values_list(
            
              "
            
            
              title
            
            
              "
            
            )               
            
              #
            
            
               找到第一個(gè)出版社出版的所有書(shū)籍的書(shū)名
            
            
              
#
            
            
              如果設(shè)置了 related_name="books"
            
            
              
#
            
            
              publisher= models.ForeignKey(to="Publisher", related_name="books")
            
            
publisher_obj =
            
               models.Publisher.objects.first()
ret 
            
            =
            
               publisher_obj.books.all()

            
            
              print
            
            (ret)
            
              #
            
            
              
                , 
                
                  ]>
                
              
            
            
              ?

            
            2
            
              .基于雙下劃線的字段方法(聯(lián)表查詢(xún))
ret 
            
            = models.Publisher.objects.filter(id=1).values_list(
            
              "
            
            
              book__title
            
            
              "
            
            
              )

            
            
              print
            
            (ret)
            
              #
            
            
              
            
            
titles = models.Publisher.objects.values_list(
            
              "
            
            
              book__title
            
            
              "
            
            
              )

            
            
              print
            
            (titles)
            
              #
            
            
              
            
            
              ?

            
            
              #
            
            
              如果related_query_name="books"或者 related_name="books"(如果兩個(gè)同時(shí)出現(xiàn),則以related_query_name為準(zhǔn))
            
            
titles = models.Publisher.objects.filter(id=1).values_list(
            
              "
            
            
              books__title
            
            
              "
            
            
              )

            
            
              #
            
            
              
            
            
titles = models.Publisher.objects.filter(id=1).values(
            
              "
            
            
              books__title
            
            
              "
            
            
              )

            
            
              #
            
            
              
            
          

ManyToManyField: (使用方式二:通過(guò)ManyToManyField自動(dòng)創(chuàng)建第三張表)

models:

            
              class
            
            
               Book(models.Model):
    title 
            
            = models.CharField(max_length=32
            
              )
    publish_date 
            
            = models.DateField(auto_now_add=
            
              True)
    price 
            
            = models.DecimalField(max_digits=5, decimal_places=2
            
              )
    memo 
            
            = models.TextField(null=
            
              True)
    
            
            
              #
            
            
               創(chuàng)建外鍵,關(guān)聯(lián)publish
            
            
    publisher = models.ForeignKey(to=
            
              "
            
            
              Publisher
            
            
              "
            
            
              , )
    
            
            
              #
            
            
               創(chuàng)建多對(duì)多關(guān)聯(lián)author
            
            
    author = models.ManyToManyField(to=
            
              "
            
            
              Author
            
            
              "
            
            
              )
?

            
            
              class
            
            
               Author(models.Model):
    name 
            
            = models.CharField(max_length=32
            
              )
    age 
            
            =
            
               models.IntegerField()
    phone 
            
            = models.CharField(max_length=11
            
              )
    detail 
            
            = models.OneToOneField(to=
            
              "
            
            
              AuthorDetail
            
            
              "
            
            )
          

class RelatedManager:"關(guān)聯(lián)管理器"是在 一對(duì)多 或者 多對(duì)多 的關(guān)聯(lián)上下文中使用的管理器。

它存在于下面兩種情況: 外鍵關(guān)系的反向查詢(xún) 多對(duì)多關(guān)聯(lián)關(guān)系 ,簡(jiǎn)單來(lái)說(shuō)就是當(dāng) "."后面的對(duì)象 可能存在多個(gè)的時(shí)候就可以使用以下的方法

create(): 創(chuàng)建一個(gè)新的對(duì)象,保存對(duì)象,并將它添加到關(guān)聯(lián)對(duì)象集之中,返回新創(chuàng)建的對(duì)象。

            
              #
            
            
              models.Book.objects.first().author得到是一個(gè)class RelatedManager對(duì)象,使用.create操作author表和第三張表
            
            
1
            
              .正向創(chuàng)建author表數(shù)據(jù)
ret 
            
            = models.Book.objects.first().author.create(name=
            
              "
            
            
              張三
            
            
              "
            
            ,age=16,phone=
            
              "
            
            
              18012xxxx
            
            
              "
            
            ,detail_id=4
            
              ) 

            
            
              #
            
            
              做了兩件事情:1. 創(chuàng)建了一個(gè)新的作者,2. 將新創(chuàng)建的作者和第一本書(shū)做關(guān)聯(lián)
            
            
ret = models.Book.objects.first().author.all().values(
            
              "
            
            
              id
            
            
              "
            
            
              )

            
            
              print
            
            (ret)
            
              #
            
            
              
            
            
2
            
              .反向創(chuàng)建book表數(shù)據(jù)

            
            
              import
            
            
               datetime
models.Author.objects.first().book_set.create(title
            
            =
            
              "
            
            
              番茄物語(yǔ)
            
            
              "
            
            , publish_date=datetime.date.today())
          

add(): 把指定的model對(duì)象或?qū)ο骾d添加到關(guān)聯(lián)對(duì)象集中

            
              #
            
            
              添加對(duì)象
            
            
author_objs = models.Author.objects.filter(id__lt=3
            
              )
models.Book.objects.first().author.add(
            
            *
            
              author_objs)

            
            
              #
            
            
              添加id
            
            
models.Book.objects.first().author.add(*[1, 2
            
              ])
models.Book.objects.first().author.add(
            
            1
            
              )

            
            
              #
            
            
              第一本書(shū)關(guān)聯(lián)的作者id
            
            
ret = models.Book.objects.first().author.all().values(
            
              "
            
            
              id
            
            
              "
            
            
              )

            
            
              print
            
            (ret)
            
              #
            
            
              
            
          

set(): 更新model對(duì)象的關(guān)聯(lián)對(duì)象。

            ret=models.Book.objects.first().author.set([2, 3])
            
              #
            
            
              設(shè)置第三張表的關(guān)聯(lián)關(guān)系,給第一個(gè)book對(duì)象加上id=2和3
            
            
ret =
            
               models.Book.objects.first().author.all()

            
            
              print
            
            (ret)
            
              #
            
            
              
                , 
                
                  , 
                  
                    ]>
                  
                
              
            
            
ret = models.Book.objects.first().author.all().values(
            
              "
            
            
              id
            
            
              "
            
            
              )

            
            
              print
            
            (ret)
            
              #
            
            
              
            
          

remove(): 從關(guān)聯(lián)對(duì)象集中移除執(zhí)行的model對(duì)象

            models.Book.objects.first().author.remove(3)
            
              #
            
            
              找到第一個(gè)圖書(shū)對(duì)象所對(duì)應(yīng)的所有作者,到第三張表中刪除它與id=3的作者的關(guān)聯(lián)關(guān)系#
              
            
            
ret = models.Book.objects.first().author.all().values(
            
              "
            
            
              id
            
            
              "
            
            
              )

            
            
              print
            
            (ret)        
            
              #
            
            
              
            
          

clear(): 從關(guān)聯(lián)對(duì)象集中移除一切對(duì)象。

            
              #
            
            
              
            
            
              models.Book.objects.first().author.clear()
ret 
            
            = models.Book.objects.first().author.all().values(
            
              "
            
            
              id
            
            
              "
            
            
              )

            
            
              print
            
            (ret)
            
              #
            
            
              
            
          

注意:對(duì)于ForeignKey對(duì)象,clear()和remove()方法僅在null=True時(shí)存在

all():

            ret = models.Book.objects.first().author.all()
            
              #
            
            
              得到第一本書(shū)對(duì)象對(duì)應(yīng)的作者對(duì)象集
            
            
              print
            
            (ret)                                
            
              #
            
            
              
            
          
12.3211 聚合查詢(xún)

aggregate()是QuerySet 的一個(gè)終止子句,它返回一個(gè)包含一些鍵值對(duì)的字典。

鍵的名稱(chēng)是聚合值的標(biāo)識(shí)符,值是計(jì)算出來(lái)的聚合值。鍵的名稱(chēng)是按照字段和聚合函數(shù)的名稱(chēng)自動(dòng)生成出來(lái)的。

            
              from
            
             django.db.models 
            
              import
            
            
               Avg, Sum, Max, Min, Count
models.Book.objects.all().aggregate(Avg(
            
            
              "
            
            
              price
            
            
              "
            
            
              ))

            
            
              #
            
            
              {'price__avg': 13.233333}
            
            
ret = models.Book.objects.aggregate(Sum(
            
              "
            
            
              price
            
            
              "
            
            
              ))

            
            
              #
            
            
              {'price__sum': Decimal('13.10')
            
            
ret = models.Book.objects.aggregate(total_price=Sum(
            
              "
            
            
              price
            
            
              "
            
            
              ))

            
            
              #
            
            
              {'total_price': Decimal('13.10')}
            
            
ret = models.Book.objects.aggregate(avg_price=Avg(
            
              "
            
            
              price
            
            
              "
            
            ), max_price=Max(
            
              "
            
            
              price
            
            
              "
            
            ), min_price=Min(
            
              "
            
            
              price
            
            
              "
            
            
              ))

            
            
              #
            
            
              {'avg_price': 4.366667, 'max_price': Decimal('12.00'), 'min_price': Decimal('0.10')}
            
          
12.3212 分組查詢(xún)

單表查詢(xún)分組:按照部門(mén)分組求平均工資

            
              select
            
             dept,
            
              AVG
            
            (salary) 
            
              from
            
             employee 
            
              group
            
            
              by
            
             dept;
          

orm查詢(xún):

            
              from
            
             django.db.models 
            
              import
            
            
               Avg
models.Employee.objects.values(
            
            
              "
            
            
              dept
            
            
              "
            
            ).annotate(avg=Avg(
            
              "
            
            
              salary
            
            
              "
            
            
              )                                   

            
            
              #
            
            
              
              
            
            
models.Employee.objects.values(
            
              "
            
            
              dept
            
            
              "
            
            ).annotate(avg=Avg(
            
              "
            
            
              salary
            
            
              "
            
            ).values(
            
              '
            
            
              dept
            
            
              '
            
            , 
            
              "
            
            
              avg
            
            
              "
            
            
              )

            
            
              #
            
            
              
              
            
          

連表查詢(xún)的分組:按照部門(mén)分組求平均工資

            
              select
            
             dept.name,
            
              AVG
            
            (salary) 
            
              from
            
             employee 
            
              inner
            
            
              join
            
             dept 
            
              on
            
             (employee.dept_id
            
              =
            
            dept.id) 
            
              group
            
            
              by
            
             dept_id;
          

ORM查詢(xún):

            
              from
            
             django.db.models 
            
              import
            
            
               Avg
models.Dept.objects.annotate(avg
            
            =Avg(
            
              "
            
            
              employee__salary
            
            
              "
            
            )).values(
            
              "
            
            
              name
            
            
              "
            
            , 
            
              "
            
            
              avg
            
            
              "
            
            
              )
?
models.Employee.objects.values(
            
            
              "
            
            
              dept__name
            
            
              "
            
            ).annotate(avg=Avg(
            
              "
            
            
              salary
            
            
              "
            
            
              ))

            
            
              #
            
            
              
              
            
            
              ?
models.Employee.objects.values(
            
            
              "
            
            
              dept__name
            
            
              "
            
            ).annotate(avg=Avg(
            
              "
            
            
              salary
            
            
              "
            
            )).values(
            
              '
            
            
              dept
            
            
              '
            
            , 
            
              "
            
            
              avg
            
            
              "
            
            
              )

            
            
              #
            
            
              
              
            
            
              ?
models.Employee.objects.values(
            
            
              "
            
            
              dept__name
            
            
              "
            
            
              )

            
            
              #
            
            
              
              
            
          

作者、圖書(shū)、出版社表關(guān)系:

            
              from
            
             django.db 
            
              import
            
            
               models

            
            
              #
            
            
               出版社
            
            
              class
            
            
               Publisher(models.Model):
    name 
            
            = models.CharField(max_length=32
            
              )
    city 
            
            = models.CharField(max_length=32
            
              )

            
            
              #
            
            
               書(shū)
            
            
              class
            
            
               Book(models.Model):
    title 
            
            = models.CharField(max_length=32
            
              )
    publish_date 
            
            = models.DateField(auto_now_add=
            
              True)
    price 
            
            = models.DecimalField(max_digits=5, decimal_places=2
            
              )
    
            
            
              #
            
            
               創(chuàng)建外鍵,關(guān)聯(lián)publish
            
            
    publisher = models.ForeignKey(to=
            
              "
            
            
              Publisher
            
            
              "
            
            
              )
    
            
            
              #
            
            
               創(chuàng)建多對(duì)多關(guān)聯(lián)author
            
            
    author = models.ManyToManyField(to=
            
              "
            
            
              Author
            
            
              "
            
            
              )

            
            
              #
            
            
               作者
            
            
              class
            
            
               Author(models.Model):
    name 
            
            = models.CharField(max_length=32)
          

示例:

            1
            
              .統(tǒng)計(jì)每一本書(shū)的作者個(gè)數(shù)
(
            
            1):ret = models.Book.objects.annotate(autor_num=Count(
            
              "
            
            
              author
            
            
              "
            
            )).values(
            
              "
            
            
              title
            
            
              "
            
            , 
            
              "
            
            
              autor_num
            
            
              "
            
            
              )

            
            
              #
            
            
              
            
            
              ?
(
            
            2):book_list = models.Book.objects.all().annotate(author_num=Count(
            
              "
            
            
              author
            
            
              "
            
            
              ))

            
            
              print
            
            (book_list)        
            
              #
            
            
              
                , 
                
                  , 
                  
                    ]>
                  
                
              
            
            
              for
            
             obj 
            
              in
            
            
               book_list:
    
            
            
              print
            
            (obj.author_num)
            
              #
            
            
              0  1  1
            
            
2
            
              .統(tǒng)計(jì)出每個(gè)出版社出版的最便宜的書(shū)的價(jià)格
(
            
            1):ret = models.Publisher.objects.annotate(min_price=Min(
            
              "
            
            
              book__price
            
            
              "
            
            )).values(
            
              "
            
            
              name
            
            
              "
            
            , 
            
              "
            
            
              min_price
            
            
              "
            
            
              )

            
            
              #
            
            
              
            
            
{
            
              '
            
            
              name
            
            
              '
            
            : 
            
              '
            
            
              北大青鳥(niǎo)出版社
            
            
              '
            
            , 
            
              '
            
            
              min_price
            
            
              '
            
            : None}]>
            
              
(
            
            2):ret=models.Book.objects.values(
            
              "
            
            
              publisher__name
            
            
              "
            
            ).annotate(min_price=Min(
            
              "
            
            
              price
            
            
              "
            
            
              ))

            
            
              #
            
            
              
            
            
              ?
(
            
            3):publisher_list = models.Publisher.objects.annotate(min_price=Min(
            
              "
            
            
              book__price
            
            
              "
            
            
              ))

            
            
              print
            
            
              (publisher_list)

            
            
              #
            
            
              
                , 
                
                  , 
                  
                    ]>
                  
                
              
            
            
              for
            
             obj 
            
              in
            
            
               publisher_list:
    
            
            
              print
            
            (obj.min_price)
            
              #
            
            
              0.10 12.00 None
            
            
3
            
              .統(tǒng)計(jì)不止一個(gè)作者的圖書(shū)   
models.Book.objects.annotate(author_num
            
            =Count(
            
              "
            
            
              author
            
            
              "
            
            )).filter(author_num__gt=1)
            
              #
            
            
              
            
            
4
            
              .根據(jù)一本圖書(shū)作者數(shù)量的多少對(duì)查詢(xún)集 QuerySet進(jìn)行排序
models.Book.objects.annotate(author_num
            
            =Count(
            
              "
            
            
              author
            
            
              "
            
            )).order_by(
            
              "
            
            
              author_num
            
            
              "
            
            
              )

            
            
              #
            
            
              
                , 
                
                  , 
                  
                    ]>
                  
                
              
            
            
5
            
              .查詢(xún)各個(gè)作者出的書(shū)的總價(jià)格
models.Author.objects.annotate(sum_price
            
            =Sum(
            
              "
            
            
              book__price
            
            
              "
            
            )).values(
            
              "
            
            
              name
            
            
              "
            
            , 
            
              "
            
            
              sum_price
            
            
              "
            
            
              )

            
            
              #
            
            
              
            
            
              
#
            
            
              {'name': '大烏龜', 'sum_price': None}, {'name': '張san', 'sum_price': None}]>
            
          
12.3213 F查詢(xún)

F() 的實(shí)例可以在查詢(xún)中引用字段,來(lái)比較同一個(gè) model 實(shí)例中兩個(gè)不同字段的值。

商品表結(jié)構(gòu):

            
              from
            
             django.db 
            
              import
            
            
               models
?

            
            
              class
            
            
               Product(models.Model):
    name 
            
            = models.CharField(max_length=32
            
              )
    price 
            
            = models.DecimalField(max_digits=6, decimal_places=2
            
              )
    
            
            
              #
            
            
               庫(kù)存數(shù)
            
            
    keep =
            
               models.IntegerField()
    
            
            
              #
            
            
               賣(mài)出數(shù)
            
            
    sale =
            
               models.IntegerField()
?
    
            
            
              def
            
            
              __str__
            
            
              (self):
        
            
            
              return
            
            
              "
            
            
              {}:{}:{}:{}
            
            
              "
            
            .format(self.name, self.price, self.keep, self.sale)
          

示例:

            
              from
            
             django.db.models 
            
              import
            
            
               F

            
            1
            
              .查詢(xún)出賣(mài)出數(shù)大于庫(kù)存數(shù)的商品
models.Product.objects.filter(sale__gt
            
            =F(
            
              "
            
            
              keep
            
            
              "
            
            
              ))

            
            
              #
            
            
              
                , 
                
                  ]>
                
              
            
            
2
            
              .Django支持F()對(duì)象之間以及F()對(duì)象和常數(shù)之間的加減乘除和取模的操作
models.Product.objects.filter(sale__gt
            
            =F(
            
              '
            
            
              keep
            
            
              '
            
            )*2
            
              )

            
            
              #
            
            
              
                ]>
              
            
            
3
            
              .修改操作也可以使用F函數(shù):比如將每個(gè)產(chǎn)品的價(jià)格提高50元
models.Product.objects.all().update(price
            
            =F(
            
              "
            
            
              price
            
            
              "
            
            )+50
            
              )

            
            4.把所有商品名后面加上
            
              "
            
            
              新款
            
            
              "
            
            
              from
            
             django.db.models.functions 
            
              import
            
            
               Concat

            
            
              from
            
             django.db.models 
            
              import
            
            
               Value
models.Product.objects.all().update(name
            
            =Concat(F(
            
              "
            
            
              name
            
            
              "
            
            ),  Value(
            
              "
            
            
              新款
            
            
              "
            
            )))
          
12.3214 Q查詢(xún)

filter() 等方法中的關(guān)鍵字參數(shù)查詢(xún)都是一起進(jìn)行“AND” 的。 如果需要執(zhí)行更復(fù)雜的查詢(xún)(例如OR語(yǔ)句),可以使用Q對(duì)象

            
              #
            
            
              賣(mài)出數(shù)大于100 并且 價(jià)格大于100塊的
            
            
models.Product.objects.filter(sale__gt=100, price__gt=100
            
              )

            
            
              #
            
            
              
                , 
                
                  ]>
                
              
            
          

示例:

            
              from
            
             django.db.models 
            
              import
            
            
               Q

            
            1
            
              .查詢(xún)賣(mài)出數(shù)大于100或者價(jià)格小于100的
models.Product.objects.filter(Q(sale__gt
            
            =100)|Q(price__lt=100))  
            
              #
            
            
              |:或
            
            
              
#
            
            
              
                , 
                
                  ]>
                
              
            
            
2
            
              .查詢(xún)庫(kù)存數(shù)是100并且賣(mài)出數(shù)不是0的產(chǎn)品
models.Product.objects.filter(Q(keep
            
            =100)&~Q(sale=0))           
            
              #
            
            
              &:與,~:非
            
            
models.Product.objects.filter(Q(kucun=100),~Q(maichu=
            
              0))

            
            
              #
            
            
              
                ]>
              
            
            
models.Product.objects.filter(Q(kucun=100)&~Q(maichu=0)).values(
            
              '
            
            
              name
            
            
              '
            
            
              )

            
            
              #
            
            
              
            
            
models.Product.objects.filter(Q(kucun=100)&~Q(maichu=0)).values_list(
            
              '
            
            
              name
            
            
              '
            
            
              )

            
            
              #
            
            
              
            
          

查詢(xún)函數(shù)可以混合使用Q 對(duì)象和關(guān)鍵字參數(shù)。所有提供給查詢(xún)函數(shù)的參數(shù)(關(guān)鍵字參數(shù)或Q 對(duì)象)都將"AND”在一起。但是,如果出現(xiàn)Q 對(duì)象,它必須位于所有關(guān)鍵字參數(shù)的前面

            
              #
            
            
              查詢(xún)產(chǎn)品名包含新款, 并且?guī)齑鏀?shù)大于60或者價(jià)格小于100的產(chǎn)品
            
            
models.Product.objects.filter(Q(keep__gt=60)|Q(price__lt=100), name__contains=
            
              "
            
            
              新款
            
            
              "
            
            
              )

            
            
              #
            
            
              
                ]>
              
            
          
12.3215 事務(wù)

開(kāi)啟一個(gè)事務(wù)可以包含一些sql語(yǔ)句,這些sql語(yǔ)句要么同時(shí)成功,要么都不成功,稱(chēng)之為事務(wù)的原子性 作用:事務(wù)用于將某些操作的多個(gè)SQL作為原子性操作,一旦有某一個(gè)出現(xiàn)錯(cuò)誤,即可回滾到原來(lái)的狀態(tài),從而保證數(shù)據(jù)庫(kù)數(shù)據(jù)完整性。

            
              import
            
            
               os

            
            
              if
            
            
              __name__
            
             == 
            
              '
            
            
              __main__
            
            
              '
            
            
              :
    os.environ.setdefault(
            
            
              "
            
            
              DJANGO_SETTINGS_MODULE
            
            
              "
            
            , 
            
              "
            
            
              BMS.settings
            
            
              "
            
            
              )
    
            
            
              import
            
            
               django
    django.setup()

    
            
            
              import
            
            
               datetime
    
            
            
              from
            
             app01 
            
              import
            
            
               models

    
            
            
              try
            
            
              :
        
            
            
              from
            
             django.db 
            
              import
            
            
               transaction
        with transaction.atomic():                                
            
            
              #
            
            
              開(kāi)啟事務(wù)
            
            
            new_publisher = models.Publisher.objects.create(name=
            
              "
            
            
              火星出版社
            
            
              "
            
            
              )
            models.Book.objects.create(title
            
            =
            
              "
            
            
              橘子物語(yǔ)
            
            
              "
            
            , publish_date=datetime.date.today(), publisher_id=10
            
              )  
           
            
            
              #
            
            
               指定一個(gè)不存在的出版社id,上一行創(chuàng)建一條出版社數(shù)據(jù)被回滾,數(shù)據(jù)庫(kù)并未創(chuàng)建新數(shù)據(jù)
            
            
              except
            
            
               Exception as e:
        
            
            
              print
            
            (str(e))     
          
12.3216 Django ORM執(zhí)行原生SQL

很多情況下我們不需要將查詢(xún)結(jié)果映射成模型,或者我們需要執(zhí)行DELETE、 INSERT以及UPDATE操作,在這些情況下,我們可以直接訪問(wèn)數(shù)據(jù)庫(kù),完全避開(kāi)模型層。我們可以直接從django提供的接口中獲取數(shù)據(jù)庫(kù)連接,然后像使用pymysql模塊一樣操作數(shù)據(jù)庫(kù)

            
              from
            
             django.db 
            
              import
            
            
               connection, connections
cursor 
            
            = connection.cursor()  
            
              #
            
            
               cursor = connections['default'].cursor()
            
            
cursor.execute(
            
              """
            
            
              SELECT * from auth_user where id = %s
            
            
              """
            
            , [1
            
              ])
ret 
            
            = cursor.fetchone()
          

更多文章、技術(shù)交流、商務(wù)合作、聯(lián)系博主

微信掃碼或搜索:z360901061

微信掃一掃加我為好友

QQ號(hào)聯(lián)系: 360901061

您的支持是博主寫(xiě)作最大的動(dòng)力,如果您喜歡我的文章,感覺(jué)我的文章對(duì)您有幫助,請(qǐng)用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點(diǎn)擊下面給點(diǎn)支持吧,站長(zhǎng)非常感激您!手機(jī)微信長(zhǎng)按不能支付解決辦法:請(qǐng)將微信支付二維碼保存到相冊(cè),切換到微信,然后點(diǎn)擊微信右上角掃一掃功能,選擇支付二維碼完成支付。

【本文對(duì)您有幫助就好】

您的支持是博主寫(xiě)作最大的動(dòng)力,如果您喜歡我的文章,感覺(jué)我的文章對(duì)您有幫助,請(qǐng)用微信掃描上面二維碼支持博主2元、5元、10元、自定義金額等您想捐的金額吧,站長(zhǎng)會(huì)非常 感謝您的哦!!!

發(fā)表我的評(píng)論
最新評(píng)論 總共0條評(píng)論