Day 53 DjangoORM數據操做

[TOC]python

DjangoORM數據操做

配置測試腳本

from django.test import TestCase
import os

if __name__ == "__main__":
os.environ.setdefault("DJANGO_SETTINGS_MODULE", "day53.settings")

    import django
    django.setup()

建立數據

咱們如今models文件中建立好Book,Publish,Author,AuthorDetail這四張表sql

create方法django

models.AuthorDetail.objects.create(phone='110', email='xxx@qq.com')models.AuthorDetail.objects.create(phone='120', email='qqq@qq.com')models.Author.objects.create(name='馮*內古特', age=80, author_detail_id=1)models.Author.objects.create(name='菲茨傑拉德', age=44, author_detail_id=2)models.Book.objects.create(title='了不得的蓋茨比', price=28.8, book_type='文學', publish_id=2)

修改數據

pk會自動幫你查找到當前表的主鍵字段,因此後期咱們都是用pk來指代主鍵字段app

filter查詢出來的結果是一個Queryset對象測試

  1. 只要是queryset對象就能夠無限制的調用queryset的方法spa

    res = models.Books.objects.filter(pk=1).filter().filter().filter().filter()code

  2. 只要是queryset對象就能夠點query查看當前結果內部對應的sql語句對象

    res.query排序

方式一rem

models.Book.objects.filter(pk=2).update(price=29.8)

方式二(不推薦使用)

# 利用對象的修改 內部實際上是重頭到位將數據的全部字段都從新寫一遍
book_obj = models.Books.objects.get(pk=1)
book_obj.price = 28.8
book_obj.save()

get和filter的區別

  1. filter獲取到的是一個queryset對象,相似於一個列表

  2. get獲取到的直接就是數據對象自己

    當條件不存在的狀況下 filter不報錯直接返回一個空 推薦使用filter方法 get直接報錯 因此不推薦使用get方法

刪除數據

  1. 利用queryset方法 delete()
models.Book.objects.filter(pk=3).delete()
  1. 對象方法
book_obj = models.Book.objects.get(pk=3)
book_obj.delete()

查詢數據

13個方法

方法 做用 示例
all() 查詢全部 models.Book.objects.all()
filter() 篩選 models.Book.objects.filter(pk=1)
get() 篩選(不存在會報錯) models.Book.objects.get(pk=1)
first() 取queryset第一個數據對象 models.Book.objects.filter(publish_id=2).first()
last() 取queryset最後一個數據對象 models.Book.objects.filter(publish_id=2).last()
count() 統計數據個數 models.Book.objects.count()
values() 獲取指定字段的值(列表套字典) models.Book.objects.values('title', 'price')
values_list() 獲取指定字段的值(列表套元組) models.Book.objects.values_list('title', 'price')
order_by() 按照指定的字段排序 models.Book.objects.all().order_by('price') 字段前面加符號表示降序
reverse() 顛倒順序(前提是已經排好序) models.Book.objects.all().order_by('price').reverse()
exclude() 排除指定的字段的值 models.Book.objects.all().excl(title='2081')
exists() 判斷查詢結果是否有值 models.Book.objects.filter(pk=1).exists()
diistinct() 對查詢結果進行去重 models.Book.objects.values('title', 'price').distinct()

雙下劃線

# 查詢價格大於30的書籍
res = models.Book.objects.filter(price__gt=30)
print(res)
# 查詢價格小於30的書籍
res = models.Book.objects.filter(price__lt=30)
print(res)
# 查詢價格大於等於30的書籍
# 對數字精確度不敏感?
res = models.Book.objects.filter(price__gte=30)
print(res)
# 查詢價格小於等於30的書籍
res = models.Book.objects.filter(price__lte=30)
print(res)
# 查詢價格是20或者30或者50的書籍
res = models.Book.objects.filter(price__in=[20, 30, 50])
print(res)
# 查詢價格在20到50之間的書籍(顧頭又顧尾)
res = models.Book.objects.filter(price__range=(20, 50))
print(res)
# 查詢註冊日期是2019的用戶
res = models.User.objects.filter(register_time__year='2019')
print(res)
# 查詢註冊日期是11月份的用戶
res = models.User.objects.filter(register_time__month='11')
# 模糊查詢
# 查詢書籍是與霍開頭的書
res = models.Book.objects.filter(title__startswith='霍')
print(res)
# 查詢書籍是以情結尾的書
res = models.Book.objects.filter(title__endswith='情')
print(res)
# 查詢書籍中含有p字母的書
res = models.Book.objects.filter(title__contains='p')  # 默認區分大小寫
res = model.Book.objects.filter(title__icontains='P')  # 忽略大小寫
print(res)

一對多字段數據的增刪改查

# 方式一
models.Book.objects.create(title='了不得的蓋茨比', price=28.8, book_type='文學', publish_id=2)
# 方式二
publish_obj = models.Publish.objects.filter(pk=2).first()
models.Book.objects.create(title='了不得的蓋茨比', price=28.8, book_type='文學', publish=publish_obj)

# 方式一
models.Book.objects.filter(pk=2).update(publish_id=1)
# 方式二
publish_obj = models.Publish.objects.filter(pk=1).first()
models.Book.objects.filter(pk=1).update(publish=publish_obj)

models.Publish.objects.filter(pk=1).delete()  # 默認就是級聯刪除 級聯更新

多對多字段數據的增刪改查

# 方式一
book_obj = models.Book.objects.filter(pk=2).first()
book_obj.author.add(1,3)  # book_obj.author已經跨到第三張表了
# 方式二
book_obj = models.Book.objects.filter(pk=2).first()
author_obj = models.Book.objects.filter(pk=1).first()
author_obj1 = models.Book.objects.filter(pk=3).first()
book_obj.author.add(author_obj, author_obj1)

add方法可以朝第三張關係表添加數據

​ 即支持傳數字

​ add(1, 3)

​ 也支持傳對象

​ add(author_obj, author_obj1)

​ 而且能夠多個

# 方式一
book_obj = models.Book.objects.filter(pk=2).first()
book_obj.author.set([4,5])
# 方式二
book_obj = models.Book.objects.filter(pk=2).first()
author_obj = models.Book.objects.filter(pk=4).first()
author_obj1 = models.Book.objects.filter(pk=5).first()
book_obj.author.set((author_obj, author_obj1))

set修改多對多關係表中的數據

既能夠傳數字也能夠傳對象

可是須要注意的是括號內必須是迭代對象

都支持多個

# 方式一
book_obj = models.Book.objects.filter(pk=2).first()
book_obj.author.remove(1,3)  # book_obj.author已經跨到第三張表了
# 方式二
book_obj = models.Book.objects.filter(pk=2).first()
author_obj = models.Book.objects.filter(pk=1).first()
author_obj1 = models.Book.objects.filter(pk=3).first()
book_obj.author.remove(author_obj, author_obj1)

清空

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

clear清空書籍相關的全部記錄,括號內不須要傳遞參數

跨表查詢

正反向查詢

​ 關係字段在哪張表裏,由這張表查另外一張表就是正向,不然就是反向

基於對象的跨表查詢

  1. 查詢書籍主鍵爲2的出版社名稱
book_obj = models.Book.objects.filter(pk=2).first()
print(book_obj.publish.name)
  1. 查詢書籍主鍵爲4的做者姓名
book_obj = models.Book.objects.filter(pk=2).first()
print(book_obj.author.all().values('name'))
  1. 查詢做者是jason的手機號碼
author_obj = models.Author.objects.filter().first()
print(author_obj.author_detail.phone)

注意

何時要加all

當正向查詢點擊外鍵字段數據有多個的狀況下,須要.all()

app01.Author.None 一旦看到該結果,只須要加.all()便可

反向查詢

  1. 查詢出版社是南方出版社出版過的書籍
publish_obj = models.Publish.objects.filter(name='南方出版社').first()
print(publish_obj.book_set.all())
  1. 查詢做者是jason寫的書籍
author_obj = models.Author.objects.filter(name='jason').first()
print(author_obj.book_set.all())
  1. 查詢手機是120的做者姓名
author_detail_obj = models.AuthorDetail.objects.filter(phone='120').first()
author_detail_obj.author_set.name

基於雙下劃線的跨表查詢

  1. 查詢書籍pk爲2的出版社名稱
# 正向
res = models.Book.objects.filter(pk=2).values('publish__name')
print(res)
# 反向
res = models.Publish.objects.filter(book__pk=2).values('name')
print(res)
  1. 查詢書籍pk爲2的做者姓名和郵箱
# 正向
res = models.Book.objects.filter(pk=2).values('author__name', 'author__email')
print(res)
# 反向
res = models.Author.objects.filter(book__pk=2).values('name', 'email')
print(res)
  1. 查詢做者是egon的家庭住址
# 正向
res = models.Author.objects.filter(name='egon').values('author_detail__addr')
print(res)
# 反向
res = models.AuthorDetail.filter(author__name='egon').values('addr')
print(res)
  1. 查詢出版社是東方出版社出版過的書的名字
# 反向
res = models.Publish.objects.filter(name='東方出版社').values('book__title')
print(res)
# 正向
res = models.Book.objects.filter(publish__name='東方出版社').values('title')
print(res)
  1. 查詢書籍pk是2的做者的手機號
# 正向
res = models.Book.objects.filter(pk=2).values('author__author_detail__phone')
print(res)
# 反向
res = models.Author.objects.filter(book__pk=2).values('author_detail__phone')
print(res)

res = models.AuthorDetail.objects.filter(author__book__pk=2).values('phone')
print(res)
相關文章
相關標籤/搜索