最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Django的多表查詢操作實(shí)戰(zhàn)

 更新時(shí)間:2023年06月09日 11:00:36   作者:?jiǎn)讨挝业腗4呢?  
Django提供一種強(qiáng)大而又直觀的方式來(lái)"處理"查詢中的關(guān)聯(lián)關(guān)系,它在后臺(tái)自動(dòng)幫你處理JOIN,下面這篇文章主要給大家介紹了關(guān)于Django多表查詢操作的相關(guān)資料,文中通過(guò)實(shí)例代碼介紹的非常詳細(xì),需要的朋友可以參考下

1 > 神奇的雙下劃線查詢

1 > 查詢年齡大于20的用戶

res = modles.User.objects.filter(age__gt=20)
	print(res)
	'''
		__gt		大于
		__lt		小于
		__gte		大于等于
		__lte		小于等于
	'''

2 > 查詢年齡是18、22、25的用戶

res = modles.User.objects.filter(age__in=[18, 22, 25])
	print(res)
	'''
		__in		成員運(yùn)算
	'''

3 > 查詢年齡在18到26之間的用戶

res = modles.User.objects.filter(age__ranger=[18, 26])
	print(res)
	'''
		__ranger	范圍查詢
	'''

4 > 查詢姓名中包含字母j的用戶

res = modles.User.objects.filter(name__contains='j')
	res = modles.User.objects.filter(name__icontains='j')
	print(res)
	'''
		__contains		區(qū)分大小寫(xiě)
		__icontains		忽略區(qū)分大小寫(xiě)
	'''

5 > 其他方法補(bǔ)充

    __startswith        以什么開(kāi)頭
    __endswith            以什么結(jié)尾
    __regex                正則

6 > 查詢?cè)路菔?月的數(shù)據(jù)

res = models.User.objects.filter(op_time__month=5)
	print(res)
	'''
		__year		按照年份篩選數(shù)據(jù)
		__month		按照月份篩選數(shù)據(jù)
	'''

2 > 外鍵字段的創(chuàng)建

MySQL復(fù)習(xí)
    關(guān)系的種類
        一對(duì)多關(guān)系
        多對(duì)多關(guān)系
        一對(duì)一關(guān)系
    關(guān)系的判斷
        換位思考
    字段的位置
        一對(duì)多關(guān)系 外鍵字段建在多的一方
        多對(duì)多關(guān)系 外鍵字段建在第三張關(guān)系表中
        一對(duì)一關(guān)系 外鍵字段建在任意一方都可以 但是推薦建在查詢頻率較高的表中

2.1 > 數(shù)據(jù)準(zhǔn)備

django orm創(chuàng)建表關(guān)系
	圖書(shū)表
  	出版社表
  	作者表
  	作者詳情表
關(guān)系判斷
	書(shū)與出版社
	  	一本書(shū)不能對(duì)應(yīng)多個(gè)出版社
	    一個(gè)出版社可以對(duì)應(yīng)多本書(shū)
	    # 一對(duì)多關(guān)系 書(shū)是多 出版社是一						ForeignKey
	    '''django orm外鍵字段針對(duì)一對(duì)多關(guān)系也是建在多的一方 '''
  書(shū)與作者
	  	一本書(shū)可以對(duì)應(yīng)多個(gè)作者
	    一個(gè)作者可以對(duì)應(yīng)多本書(shū)
	    # 多對(duì)多關(guān)系 										ManyToManyField
	    '''django orm外鍵字段針對(duì)多對(duì)多關(guān)系 可以不用自己創(chuàng)建第三張表'''
  作者與作者詳情
	  	一個(gè)作者不能對(duì)應(yīng)多個(gè)作者詳情
	    一個(gè)作者詳情不能對(duì)個(gè)多個(gè)作者
	    # 一對(duì)一關(guān)系											OneToOneField
	    '''django orm外鍵字段針對(duì)一對(duì)一關(guān)系 建在查詢頻率較高的表中'''
	注意事項(xiàng):
		'''
			ManyToManyField不會(huì)在表中創(chuàng)建實(shí)際的字段 而是告訴django orm自動(dòng)創(chuàng)建第三張關(guān)系表
			ForeignKey、OneToOneField會(huì)在字段的后面自動(dòng)添加_id后綴 
			如果你在定義模型類的時(shí)候自己添加了該后綴那么遷移的時(shí)候還會(huì)再次添加_id_id 
			所以不要自己加_id后綴
		'''
	關(guān)鍵字里面的參數(shù)說(shuō)明
		to:	用于指定跟哪張表有關(guān)系 自動(dòng)關(guān)聯(lián)主鍵
		to_field\to_fields: 也可自己指定關(guān)聯(lián)字段

2.2 > 代碼創(chuàng)建

from django.db import models
# Create your models here.
class Book(models.Model):
    """圖書(shū)表"""
    title = models.CharField(max_length=32, verbose_name='書(shū)名')
    price = models.DecimalField(max_digits=8, decimal_places=2, verbose_name='價(jià)格')
    publish_time = models.DateTimeField(auto_now_add=True, verbose_name='出版日期')
    # 書(shū)與出版社的外鍵字段 一對(duì)多
    publish = models.ForeignKey(to='Publish')
    # 書(shū)與作者的外鍵字段     多對(duì)多
    authors = models.ManyToManyField(to='Author')
    def __str__(self):
        return '書(shū)籍對(duì)象:%s' % self.title
class Publish(models.Model):
    """出版社"""
    name = models.CharField(max_length=32, verbose_name='出版社名稱')
    addr = models.CharField(max_length=32, verbose_name='出版社地址')
    def __str__(self):
        return '出版社對(duì)象:%s' % self.name
class Author(models.Model):
    """作者表"""
    name = models.CharField(max_length=32, verbose_name='作者姓名')
    age = models.IntegerField(verbose_name='年齡')
    # 作者與作者詳情外鍵字段  一對(duì)一
    author_detail = models.OneToOneField(to='AuthorDetail')
    def __str__(self):
        return '作者對(duì)象:%s' % self.name
class AuthorDetail(models.Model):
    """作者詳情"""
    phone = models.BigIntegerField(verbose_name='手機(jī)號(hào)')
    addr = models.CharField(max_length=64, verbose_name='家庭地址')
    def __str__(self):
        return '地址詳情對(duì)象:%s' % self.addr
'''
	運(yùn)行數(shù)據(jù)庫(kù)遷移命令
		makemigrations
		migrations
'''

3 > 外鍵字段操作

3.1 > 一對(duì)多、一對(duì)一外鍵字段操作

增加數(shù)據(jù)
		models.Book.objects.create(title='聊齋志異',price=1699.80,publish_id=1)
		'''
			publish_id=1					author_detail_id=1
		'''
		publish_obj = models.Publish.objects.filter(pk=2).first()
   	 	models.Book.objects.create(title='資本論',price=9566.02,publish=publish_obj)
		'''
			publish=publish_obj  			author_detail=detail_obj
		'''
	修改數(shù)據(jù)
		models.Book.objects.filter(pk=11).update(publish_id=2)
		'''
			update(publish_id=3)		update(author_detail_id=3)
		'''
		publish_obj = models.Publish.objects.filter(pk=1).first()
   	 	models.Book.objects.filter(pk=11).update(publish=publish_obj)
   	 	'''
			update(publish=publish_obj)  update(author_detail=detail_obj)
		'''

3.2 > 多對(duì)多字段操作

主要知識(shí)點(diǎn):

    1.第三張關(guān)系表創(chuàng)建數(shù)據(jù)
        book_obj = models.Book.objects.filter(pk=1).first()
          book_obj.authors.add()
              括號(hào)內(nèi)可以放主鍵值也可以放數(shù)據(jù)對(duì)象 并且都支持多個(gè)
              
      2.第三張關(guān)系表修改數(shù)據(jù)
          book_obj.authors.set()
            括號(hào)內(nèi)必須是一個(gè)可迭代對(duì)象 元素同樣支持主鍵值或者數(shù)據(jù)對(duì)象
            
      3.第三張關(guān)系表刪除數(shù)據(jù)
          book_obj.authors.remove()
            括號(hào)內(nèi)可以放主鍵值也可以放數(shù)據(jù)對(duì)象 并且都支持多個(gè)
            
      4.第三張關(guān)系表清空指定數(shù)據(jù)
          book_obj.authors.clear()
            括號(hào)內(nèi)無(wú)需傳值 直接清空當(dāng)前表在第三張關(guān)系表中的綁定記錄

操做代碼如下:

book_obj = models.Book.objects.filter(pk=7).first()
    # 給多對(duì)多虛擬關(guān)鍵表添加關(guān)系
    # book_obj.authors.add(2)
    authors_obj = models.Author.objects.filter(pk=2).first()
    authors_obj1 = models.Author.objects.filter(pk=3).first()
    book_obj.authors.add(authors_obj1, authors_obj)
    # 修改關(guān)系
    book_obj = models.Book.objects.filter(pk=11).first()
    book_obj.authors.set([3, 6])
    authors_obj1 = models.Author.objects.filter(pk=6).first()
    authors_obj2 = models.Author.objects.filter(pk=7).first()
    book_obj.authors.set([authors_obj2,authors_obj1])
    # 刪除數(shù)據(jù)
    book_obj = models.Book.objects.filter(pk=11).first()
    book_obj.authors.remove(6,7)
    authors_obj = models.Author.objects.filter(pk=6).first()
    book_obj.authors.remove(authors_obj)
    # 清空數(shù)據(jù)
    book_obj.authors.clear()

4 > 多表查詢

    MySQL多表查詢思路
        子查詢
            將SQL語(yǔ)句用括號(hào)括起來(lái)當(dāng)做條件使用
        連表操作
            inner join\left join\right join\union
    
    django orm本質(zhì)還是使用的上述兩種方法
        子查詢>>>:基于對(duì)象的跨表查詢
        連表操作>>>:基于雙下劃線的跨表查詢

4.1 > 正反向的概念

    核心在于當(dāng)前數(shù)據(jù)對(duì)象是否含有外鍵字段 有則是正向 沒(méi)有則是反向
    
    正向:
        eg:
            由書(shū)籍查詢出版社 外鍵字段在書(shū)籍表中 那么書(shū)查出版社就是'正向'
            由書(shū)籍查詢作者 外鍵字段在書(shū)籍表中 那么書(shū)查作者就是'正向'
            由作者查詢作者詳情 外鍵字段在作者表中 那么也是'正向'

    反向
        eg:
            由出版社查詢書(shū)籍 外鍵字段不在出版社表 那么出版社查書(shū)就是'反向'
    
    """
     查詢口訣
         正向查詢按外鍵字段名
         反向查詢按表名小寫(xiě)
     """

4.2 > 基于對(duì)象的跨表查詢

操做代碼如下:

"""基于對(duì)象的跨表查詢本質(zhì)就是子查詢即分步操作即可"""
	# 1.查詢數(shù)據(jù)分析書(shū)籍對(duì)應(yīng)的出版社(正向 一對(duì)多)
    # book_obj = models.Book.objects.filter(pk=11).first()
    # res = book_obj.publish
    # print(res)
    # 2.查詢python全棧開(kāi)發(fā)對(duì)應(yīng)的作者(正向 多對(duì)多)
    # book_obj = models.Book.objects.filter(pk=11).first()
    # res = book_obj.authors.all()
    # print(res)
    # 3.查詢作者jason的詳情信息(正向 多對(duì)多)
    # authors_obj = models.Author.objects.filter(name='jason').first()
    # res = authors_obj.author_detail
    # print(res)
    # 4.查詢東方出版社出版的書(shū)籍(反向 多對(duì)多)
    # publish_obj = models.Publish.objects.filter(name='東方出版社').first()
    # res = publish_obj.book_set.all()
    # print(res)
    # 5.查詢jason編寫(xiě)的書(shū)籍(反向 多對(duì)多)
    # authors_obj = models.Author.objects.filter(name='jason').first()
    # res = authors_obj.book_set.all()
    # print(res)
    # 6.查詢電話是110的作者(反向 一對(duì)一)
    # authors_detail_obj = models.AuthorDetail.objects.filter(phone='110').first()
    # res = authors_detail_obj.author
    # print(res)

4.3 > 基于雙下劃線的跨表查詢

"""基于雙下劃線的跨表查詢本質(zhì)就是連表操作"""
	# 基于雙下劃線的跨表查詢
		"""
		    查詢數(shù)據(jù)分析書(shū)籍對(duì)應(yīng)的價(jià)格和出版日期
		    models.Book.objects.filter(title='數(shù)據(jù)分析').values('price','publish_time')
	    """
	    '''手上有什么條件就先拿models點(diǎn)該條件對(duì)應(yīng)的表名'''
	     # 1.查詢數(shù)據(jù)分析書(shū)籍對(duì)應(yīng)的出版社名稱
	    # res = models.Book.objects.filter(title='數(shù)據(jù)分析').values('publish__name')
	    # print(res)
	    # 2.查詢python全棧開(kāi)發(fā)對(duì)應(yīng)的作者姓名和年齡
	    # res = models.Book.objects.filter(title='python').values('authors__age','authors__name')
	    # print(res)
	    # 3.查詢作者jason的手機(jī)號(hào)和地址
	    # res = models.Author.objects.filter(name='jason').values('author_detail__phone','author_detail__addr')
	    # print(res)
	    # 4.查詢東方出版社出版的書(shū)籍名稱和價(jià)格
	    # res = models.Publish.objects.filter(name='東方出版社').values('book__title','book__price')
	    # print(res)
	    # 5.查詢jason編寫(xiě)的書(shū)籍名稱和日期
	    # res = models.Author.objects.filter(name='jason').values('book__title','book__publish_time')
	    # print(res)
	    # 6.查詢電話是110的作者的姓名和年齡
	    # res = models.AuthorDetail.objects.filter(phone='110').values('author__name','author__age')
	    # print(res)

4.4 > 雙下線查詢擴(kuò)展

1.查詢數(shù)據(jù)分析書(shū)籍對(duì)應(yīng)的出版社名稱
    res = models.Publish.objects.filter(book__title='數(shù)據(jù)分析').values('name')
    print(res)
    # 2.查詢python全棧開(kāi)發(fā)對(duì)應(yīng)的作者姓名和年齡
    res = models.Author.objects.filter(book__title='python').values('name', 'age')
    print(res)
    # 3.查詢作者jason的手機(jī)號(hào)和地址
    res = models.AuthorDetail.objects.filter(author__name='jason').values('phone', 'addr')
    print(res)
    # 4.查詢東方出版社出版的書(shū)籍名稱和價(jià)格
    res = models.Book.objects.filter(publish__name='東方出版社').values('title', 'price')
    print(res)
    # 5.查詢jason編寫(xiě)的書(shū)籍名稱和日期
    res = models.Book.objects.filter(authors__name='jason').values('title', 'publish_time')
    print(res)
    # 6.查詢電話是110的作者的姓名和年齡
    res = models.Author.objects.filter(author_detail__phone='110').values('name', 'age')
    print(res)
    # 連續(xù)跨表操作
    # 查詢python全棧開(kāi)發(fā)對(duì)應(yīng)的作者的手機(jī)號(hào)
    res = models.AuthorDetail.objects.filter(author__book__title='python').values('phone')
    print(res)
    res = models.Book.objects.filter(title='python').values('authors__author_detail__phone')
    print(res)
	"""
	可能出現(xiàn)的不是疑問(wèn)的疑問(wèn):如何獲取多張表里面的字段數(shù)據(jù)
	res = models.Book.objects.filter(title='python全棧開(kāi)發(fā)').values('authors__author_detail__phone','authors__name','title')
	print(res)
	"""

4.5 > 如何查看SQL語(yǔ)句

    方式1:如果結(jié)果集對(duì)象是queryset 那么可以直接點(diǎn)query查看
    方式2:配置文件固定配置
          適用面更廣 只要執(zhí)行了orm操作 都會(huì)打印內(nèi)部SQL語(yǔ)句

總結(jié)

到此這篇關(guān)于Django的多表查詢操作實(shí)戰(zhàn)的文章就介紹到這了,更多相關(guān)Django多表查詢內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • 利用Python連接MySQL超詳細(xì)實(shí)戰(zhàn)教程

    利用Python連接MySQL超詳細(xì)實(shí)戰(zhàn)教程

    mysql是關(guān)系型數(shù)據(jù)庫(kù),支持大型的數(shù)據(jù)庫(kù),可以處理?yè)碛猩锨f(wàn)條記錄的大型數(shù)據(jù)庫(kù),這篇文章主要介紹了利用Python連接MySQL的相關(guān)資料,文中通過(guò)代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2026-02-02
  • django query模塊

    django query模塊

    這篇文章主要介紹了django query模塊,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2019-04-04
  • 將圖片文件嵌入到wxpython代碼中的實(shí)現(xiàn)方法

    將圖片文件嵌入到wxpython代碼中的實(shí)現(xiàn)方法

    前面一篇文章中提到的那個(gè)程序,GUI中包含了一張圖片。在編譯成exe文件發(fā)布時(shí),無(wú)法直接生成一個(gè)單獨(dú)的exe文件。因此需要直接把圖片寫(xiě)入到代碼中
    2014-08-08
  • 基于python-pptx庫(kù)中文文檔及使用詳解

    基于python-pptx庫(kù)中文文檔及使用詳解

    今天小編就為大家分享一篇基于python-pptx庫(kù)中文文檔及使用詳解,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2020-02-02
  • Python使用Turtle模塊繪制國(guó)旗的方法示例

    Python使用Turtle模塊繪制國(guó)旗的方法示例

    這篇文章主要給大家介紹了關(guān)于Python使用Turtle模塊繪制國(guó)旗的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2021-02-02
  • python統(tǒng)計(jì)一個(gè)文本中重復(fù)行數(shù)的方法

    python統(tǒng)計(jì)一個(gè)文本中重復(fù)行數(shù)的方法

    這篇文章主要介紹了python統(tǒng)計(jì)一個(gè)文本中重復(fù)行數(shù)的方法,涉及針對(duì)Python中dict對(duì)象的使用及相關(guān)本文的操作,具有一定的借鑒價(jià)值,需要的朋友可以參考下
    2014-11-11
  • 使用Python批量處理圖片的實(shí)戰(zhàn)指南

    使用Python批量處理圖片的實(shí)戰(zhàn)指南

    當(dāng)Word文檔里的圖片成了攔路虎,這種時(shí)候,Python就派上用場(chǎng)了,它不會(huì)抱怨重復(fù)勞動(dòng),也不會(huì)因?yàn)檠刍c(diǎn)錯(cuò)圖片,下面我們就來(lái)看看如何使用Python腳本實(shí)現(xiàn)批量處理圖片吧
    2026-03-03
  • Python打造出適合自己的定制化Eclipse IDE

    Python打造出適合自己的定制化Eclipse IDE

    這篇文章主要介紹了Python打造出適合自己的定制化Eclipse IDE的相關(guān)資料,需要的朋友可以參考下
    2016-03-03
  • Python設(shè)計(jì)模式之裝飾模式實(shí)例詳解

    Python設(shè)計(jì)模式之裝飾模式實(shí)例詳解

    這篇文章主要介紹了Python設(shè)計(jì)模式之裝飾模式,結(jié)合實(shí)例形式詳細(xì)分析了裝飾模式的概念、原理并結(jié)合Python實(shí)例形式分析了裝飾模式的相關(guān)使用技巧,需要的朋友可以參考下
    2019-01-01
  • Python實(shí)例之wxpython中Frame使用方法

    Python實(shí)例之wxpython中Frame使用方法

    本文介紹下wxpython中Frame的用法,不錯(cuò)的python編程實(shí)例,有需要的朋友參考下
    2014-06-06

最新評(píng)論

南京市| 彰化市| 临夏县| 浮梁县| 同心县| 乐山市| 江山市| 哈尔滨市| 阿尔山市| 昌图县| 仙居县| 区。| 长海县| 化州市| 永新县| 南华县| 高安市| 无极县| 恩施市| 甘南县| 兴和县| 综艺| 交城县| 都匀市| 乌兰察布市| 牙克石市| 修武县| 五大连池市| 上思县| 泰来县| 布尔津县| 怀远县| 礼泉县| 普格县| 榆树市| 光泽县| 通辽市| 台安县| 长宁区| 永泰县| 大洼县|