【1024 | Day52】Django基礎之模型層(models.py)

Django基礎之模型(models)層(上)

Django測試環境搭建:拷貝manage.py中的行代碼放到tests.py文件中導入模塊sql

import django`,`django.setup()

若是你想查看orm語句內部真正的sql語句有2種方法:django

1.若是是queryset對象,就能夠.query查看該queryset對象的內部sql語句json

2.在settings.py文件中配置測試

LOGGING = {
                'version': 1,
                'disable_existing_loggers': False,
                'handlers': {
                    'console': {
                        'level': 'DEBUG',
                        'class': 'logging.StreamHandler',
                    },
                },
                'loggers': {
                    'django.db.backends': {
                        'handlers': ['console'],
                        'propagate': True,
                        'level': 'DEBUG',
                    },
                }}

1. 單表查詢

1.1 增刪改查

code

  • 方式一:
models.Book.objects.create(title = '三國演義',price = 12.22)
  • 方式二:
book_obj = models.Book(title='三國演義',price='12.22')
book_obj.save()

orm

models.Book.objects.filter(pk=2).delete()

對象

models.Book.objects.filter(pk=2).update(title = '紅樓夢',price = 22.22)

blog

res = models.Book.objects.filter(pk=2)

1.2 必知必會13條

all():查全部,查詢結果爲Queryset對象排序

res = models.Book.objects.all()
print(res)

filter:查詢結果爲Queryset對象

res = models.Book.objects.filter(pk=2)

get():查詢結果爲數據對象自己,和filter查詢類似,不推薦使用

res = models.Book.objects.get(pk=2)

first():查詢第一個

res = models.Book.objects.first()

last():查詢最後一個

res = models.Book.objects.last()   #res能夠.title,.price

exclude():哪個排除以外

res = models.Book.objects.exclude(pk=3)

values():查詢結果爲列表套字典的Queryset對象

res = models.Book.objects.values('title')

value_list():查詢結果爲列表套元組的Queryset對象

res = models.Book.objects.values_list('title')

count():統計數據的條數

res = models.Book.objects.count('title')
res = models.Book.objects.all.count('title')

distinct():數據必須是如出一轍的狀況下去重

res = models.Book.objects.distinct()  #無變化
res = models.Book.objects.values('title').distinct()

order_by():排序

res = models.Book.objects.order_by('price')   #默認升序
res = models.Book.objects.order_by('-price')   #降序

reverse():排序後反轉(纔有意義)

res = models.Book.objects.reverse()

exists():是否存在

models.Book.objects.filter(pk=1).exists()

1.3 雙下劃線查詢(升級!!!)

查詢價格大於200的書籍

models.Book.objects.filter(price__gt=200)

查詢價格小於200的書籍

models.Book.objects.filter(price__lt=200)

查詢價格大於等於200的書籍

models.Book.objects.filter(price__gte=200)

查詢價格小於等於200的書籍

models.Book.objects.filter(price__lte=200)

查詢價格是200元或者300元的書籍

res = models.Book.objects.filter(price__in=[200,300])

查詢價格是200到500元之間的書籍

res = models.Book.objects.filter(price__range=(200,500))  #顧頭不顧尾

查詢書籍中包含p的書籍

res = models.Book.objects.filter(title__contains='p')   #區分大小寫
res = models.Book.objects.filter(title__icontains='p')   #不區分大小寫

查詢書籍名稱是以三開頭的書籍

res = models.Book.objects.filter(title__startswith="三")

查詢書籍名稱是以三結尾的書籍

res = models.Book.objects.filter(title__endswith="三")

查詢出版日期是2019年的書籍

res = models.Book.objects.filter(data__year="2019")

查詢出版日期是10月份的書籍

res = models.Book.objects.filter(data__month="10")

2. 多表查詢

2.1 外鍵的字段的增刪改查

2.1.1 一對多字段的增刪改查

  • 方式一:
models.Book.objects.create(title='xxx',price=66.66,publish_id=1)
  • 方式二:
publish_obj =models.Publish.objects.filter(pk=2).first()
models.Book.objects.create(title='xxx',price=66.66, publish_id=publish_obj)

book_obj = models.Book.objects.filter(pk=1).first()
print(book_obj.publish.name)
print(book_obj.publish_id)

  • 方式一:
models.Book.objects.filter(pk=3).update(publish_id=3)
  • 方式二:
publish_obj = models.Publish.objects.filter(pk=1).first()
models.Book.objects.filter(pk=3).update(publish_id=publish_obj)  #給書更換出版社

models.Book.objects.filter(pk=3).delete()

2.1.2 多對多字段的增刪改查

  • 方式一:
book_obj = models.Book.objects.filter(pk=3).first()
print(book_obj.author)  # 就至關於已經到書籍與做者的關係表中
book_obj.author.add(1)
book_obj.author.add(2, 3)  # 還能夠添加多個值

author_obj = models.Author.objects.filter(pk=1).first()
book_obj.author.add(author_obj)

author_obj = models.Author.objects.filter(pk=1).first()
author_obj1 = models.Author.objects.filter(pk=2).first()
book_obj.author.add(author_obj, author_obj1)   # 還能夠添加多個值

'''
add()  括號內 既能夠串數字,也能夠傳對象
而且支持傳多個
可是括號內必須是可迭代對象
'''

#方式一
book_obj = models.Book.objects.filter(pk=3).first()
book_obj.author.remove(2)
book_obj.author.remove(1,2)

#方式二
author_obj = models.Author.objects.filter(pk=1).first()
author_obj1 = models.Author.objects.filter(pk=2).first()
book_obj.author.remove((author_obj, author_obj1))

'''
remove()  括號內 既能夠串數字,也能夠傳對象
而且支持傳多個
'''
#清空

book_obj = models.Book.objects.filter(pk=3).first()
book_obj.author.clear()

'''clear括號內不須要傳任何參數 直接清空當前書籍對象全部的記錄'''

#方式一
book_obj = models.Book.objects.filter(pk=3).first()
book_obj.author.set([3, ])


#方式二
author_obj = models.Author.objects.filter(pk=1).first()
author_obj1 = models.Author.objects.filter(pk=2).first()
book_obj.author.set((author_obj, author_obj1))

'''
set()  括號內 既能夠串數字,也能夠傳對象
而且支持傳多個
可是括號內必須是可迭代對象
'''

2.2 表與表之間的關聯查詢

2.2.1 基於對象的跨表查詢(子查詢)

  • 正向查詢按字段
  • 反向查詢按表名小寫

當該字段所對應的數據有多個的時候 須要加.all( ),不然點外鍵字段直接就可以拿到數據對象

查詢書籍是Python入門的出版社名稱(一對多)

book_obj = models.Book.objects.filter(title='python入門').first()
print(book_obj.publish.name)
print(book_obj.publish.addr)

查詢書籍主鍵爲6的做者姓名(多對多)

book_obj = models.Book.objects.filter(pk=6).first()
print(book_obj.author)  #None
print(book_obj.author.all())   #拿到當前這本書全部的做者

查詢做者是Jason的手機號(一對一)

author_obj = models.Author.objects.filter(name='jason').first()
print(author_obj.author_detail.phone)

查詢出版社是東方出版社出版過的書籍

publish_obj = models.Publish.objects.filter(name="東方出版社").first()
print(publish_obj.book_set.all())

查詢做者是Jason寫過的全部的書

author_obj = models.Author.objects.filter(name='json').first()
print(author_obj.book_set.all())

查詢手機號是110的做者

phone_obj = models.AuthorDetail.objects.filter(phone=110).first()
print(phone_obj.author)

2.2.2 基於雙下劃線的跨表查詢(連表查詢)

查詢書籍是Python入門的出版社名稱

正向:

models.Book.objects.filter(name='python入門').values('publish__name')

反向:

models.Publish.objects.filter(book__title='python入門').value('name')

查詢做者是jason的手機號碼

正向:

models.Author.objects.filter(name='json').values('author_detail__phone')

反向

models.AuthorDetail.objects.filter(author__book__author='json').values('phone','author_age')  #還能夠加本身的年齡

查詢手機號是120的做者姓名和地址

正向

models.AuthorDetail.objects.filter(phone='120').values('author__name')

反向

models.Author.objects.filter(author_detail__phone=120).values('name',,'author_detail__addr')

查詢出版社是東方出版社出版的書籍名稱

正向:

models.Publish.objects.filter(name='東方出版社').values('book__title')

反向:

models.Book.objects.filter(author__book__publish='東方出版社').values('title')

查詢做者是jason的寫過的書的名字和價格

正向:

models.Author.objects.filter(name='json').values('book__title','book__price')

反向:

models.Book.objects.filter(author__name='json').values('title','price')

查詢書籍是python入門的做者的手機號

正向:

models.Book.objects.filter(name='python入門').values('authors__author_detail__phone')

反向:

models.AuthorDetail.objects.filter(author__book__title='python入門').values('phone')

3. 拓展

auto_now:每次修改數據的時候,都會自動更新時間

auto_now_add:在建立數據的時候,會自動將當前時間記錄下來,後期若是你不人爲修改的話,數據不變

queryset:只要是queryset對象就能夠無限的點queryset對象的方法

eg:一步步篩選

queryset.excult(pk=1).filter(pk=3).filter(pk=4)

return:return返回的必須是字符串,其餘的類型直接報錯,此處能夠寫在models.py中。

正反向概念:

書籍對象查出版社 外鍵字段在書籍 正向查詢

出版社查書籍 外鍵字段在書籍 反向查詢

注意:計算機語言是基於英語語境開發的語言,因此能夠用英語的語法角度出發理解,沒必要太中式思考。不管是正向仍是反向查詢,只須要按着你想查找的結果爲最終目的去運用命令,能夠輕鬆理解查詢這一塊的知識。

相關文章
相關標籤/搜索