我們用到的Article模型如下所示:from django.db import models

class Article(models.Model):
title = models.CharField('標(biāo)題', max_length=200, unique=True)
body = models.TextField('正文')
created = models.DateTimeField(auto_now_add=True)

def __str__(self):

return self.title

對(duì)于新增數(shù)據(jù),Django提供了兩種方法,save()create()方法。

方法一:save方法

from .models import Article

article = Article(title="My first article", body="My first article body")
article.save()

注意: 該方法如果不主動(dòng)選擇save(), 創(chuàng)建的對(duì)象實(shí)例只會(huì)存于內(nèi)存之中,不會(huì)保存到數(shù)據(jù)庫(kù)中去。正因?yàn)槿绱耍?a href="http://www.dlbhg.com/blog/building-restful-apis-with-django-and-django-rest-framework-implementing-crud-operations/">Django還提供了更便捷的create方法。

方法二:create方法

article = Article.objects.create(title="My first article", body="My first article body")

為了避免重復(fù)創(chuàng)建數(shù)據(jù)表中已存在的條目,Django還提供了get_or_create方法。它會(huì)返回查詢到的或新建的模型對(duì)象實(shí)例,還會(huì)返回這個(gè)對(duì)象實(shí)例是否是剛剛創(chuàng)建的。

obj, created = Article.objects.get_or_create(title="My first article", body="My first article body")

注意: 對(duì)Django自帶auth模塊中的User模型操作,比如創(chuàng)建新的用戶時(shí),請(qǐng)用create_user方法。該方法會(huì)將密碼自動(dòng)加Hash存儲(chǔ)到數(shù)據(jù)庫(kù)中, 如下所示:from django.contrib.auth.models import User

user = User.objects.create_user(username='john, email='john@gmail.com',password='somepwd')

方法三:bulk_create方法

在Django中向數(shù)據(jù)庫(kù)中插入多條數(shù)據(jù)時(shí),每使用save或create方法保存一條就會(huì)執(zhí)行一次SQL。而Django提供的bulk_create方法可以一次SQL添加多條數(shù)據(jù),效率要高很多,如下所示:

# 內(nèi)存生成多個(gè)對(duì)象實(shí)例
articles = [Article(title="title1", body="body1"), Article(title="title2", body="body2"), Article(title="title3", body="body3")]

# 執(zhí)行一次SQL插入數(shù)據(jù)
Article.objects.bulk_create(articles)

刪即從數(shù)據(jù)表中刪除一個(gè)已有條目。Django也允許同時(shí)刪除一條或多條數(shù)據(jù)。

刪除單條數(shù)據(jù)

# 刪除第5篇文章

Article.objects.get(pk=5).delete()

刪除部分?jǐn)?shù)據(jù)

# 刪除標(biāo)題含有python的文章

Article.objects.filter(title__icontains="python").delete()

刪除所有數(shù)據(jù)

# 慎用

Article.objects.all().delete()

改既可以用save方法,也可以用update方法。其區(qū)別在于save方法不僅可以更新數(shù)據(jù)中現(xiàn)有對(duì)象數(shù)據(jù),還可以創(chuàng)建新的對(duì)象。而update方法只能用于更新已有對(duì)象數(shù)據(jù)。一般來(lái)說(shuō),如果要同時(shí)更新多個(gè)對(duì)象數(shù)據(jù),用update方法或bulk_update方法更合適。

方法一:save方法

article = Article.objects.get(id=1)
article.title = "New article title"

article.save()

方法二:update方法

更新單篇文章

article = Article.objects.get(id=1).update(title='new title')

方法三:update方法

同時(shí)更新多篇文章# 更新所有文章標(biāo)題

article = Article.objects.filter(title__icontains='python').update(title='Django')

方法四:bulk_update方法

bulk_create方法類似,Django還提供了bulk_update方法可以對(duì)數(shù)據(jù)庫(kù)里的數(shù)據(jù)進(jìn)行批量更新。

查主要使用get, filter及exclude方法,而且這些方法是可以聯(lián)用的。

查詢所有數(shù)據(jù)

# QuerySet類型,實(shí)例對(duì)象列表
Article.objects.all()
# 字典列表
Article.objects.all().values()
# 只獲取title-字典形式
Article.objects.all().values('title')
# 只獲取title列表- 元組形式,只有value,沒有key
Article.objects.all().values_list('title')
# 只獲取title列表,只有value

Article.objects.all().values_list('title', flat=True)

查詢單條數(shù)據(jù)

article = Article.objects.get(id=11)

當(dāng)上述查詢有個(gè)問(wèn)題,如果id不存在,會(huì)拋出錯(cuò)誤。還有一種方式是使用filter方法, 這樣即使id不存在也不會(huì)報(bào)錯(cuò)。

article = Article.objects.filter(id=1).first()

一個(gè)更好的方式是使用Django提供的get_object_or_404方法,如下所示:from django.shortcuts import get_object_or_404

article = get_object_or_404(Article, pk=1)

查詢多條數(shù)據(jù)

按大于、小于及不等于查詢

# gte:大于等于,lte:小于等于
articles = Article.objects.filter(id__gte=2).filter(id__lte=11)
# 不等于

articles = Article.objects.exclude(id=10)

按范圍查詢

# 按范圍查詢,in或者range
articles = Article.objects.filter(id__range=[2, 11])

articles = Article.objects.filter(id__in=[3, 6,9])

字符串模糊查詢

#標(biāo)題包含python,若忽略大小寫使用icontains
articles = Article.objects.filter(title__contains='python')

#標(biāo)題以python開頭,若忽略大小寫使用istartswith
articles = Article.objects.filter(title__startswith='python')

#標(biāo)題是python結(jié)尾的,若忽略大小寫使用__iendswith

articles = Article.objects.filter(title__endswith='python')

按日期時(shí)間查詢

# 查詢2021年發(fā)表的文章
articles = Article.objects.filter(created__year=2021)

# 查詢2021年1月1日以后發(fā)表的文章
import datetime
Article.objects.filter(created__gt=datetime.date(2021, 1, 1))

# 與當(dāng)前時(shí)間相比,查詢即將發(fā)表的文章
from django.utils import timezone
Article.objects.filter(created__gt=timezone.now())

# 按絕對(duì)時(shí)間范圍查詢,查詢2021年1月1日到6月30日發(fā)表文章
article = Aritlce.objects.filter(created__gte=datetime.date(2021, 1, 1),
pub_date__lte=datetime.date(2021, 6, 30))

# 按相對(duì)時(shí)間范圍查詢,用range查詢3月1日以后30天內(nèi)發(fā)表文章
startdate = datetime.date(2021, 3, 1)
enddate = startdate + datetime.timedelta(days=30)

Article.objects.filter(pub_date__range=[startdate, enddate])

切片、排序、去重

# 切片
articles = Article.objects.filter(created__year=2021)[:5]

# 排序:created正序,-表示逆序
articles = Article.objects.all().order_by('-created')

# 去重

Article.objects.filter(title__icontains='python').distinct()

高級(jí)Q和F方法

Q方法

有時(shí)候我們需要執(zhí)行or邏輯的條件查詢,這時(shí)使用Q方法就可以了,它可以連接多個(gè)查詢條件。Q對(duì)象前面加~可以表示否定。

from django.models import Q
# 查詢標(biāo)題含有python或Django的文章
article = Article.objects.filter(Q(title__icontains='python')|Q(title__icontains='django'))
# 查詢標(biāo)題含有python,不含有Django的文章
article = Article.objects.filter(Q(title__icontains='python')|~Q(title__icontains='django'))

F方法

使用F()方法可以實(shí)現(xiàn)基于自身字段值來(lái)過(guò)濾一組對(duì)象,它還支持加、減、乘、除、取模和冪運(yùn)算等算術(shù)操作。from django.db.models import F
Article.objects.filter(n_commnets__gt=F('n_pingbacks'))

Article.objects.filter(n_comments__gt=F('n_pingbacks') * 2)

小結(jié)

本章我們介紹了Django中常用的模型查詢API,并以博客為例介紹了如何使用這些語(yǔ)句對(duì)數(shù)據(jù)庫(kù)里的數(shù)據(jù)進(jìn)行增刪改查。我們還沒有介紹更高級(jí)的跨表查詢,比如annotateaggregate,?select_relatedprefech_related方法,這些會(huì)放在Django高級(jí)教程部分的模型查詢篇,請(qǐng)歡迎關(guān)注。

文章轉(zhuǎn)自微信公眾號(hào)@AI Prompt提示工程師

上一篇:

DRF庫(kù)詳解:用Django輕松搭建功能強(qiáng)大的API服務(wù)

下一篇:

使用 Django REST Framework構(gòu)建Web API操作步驟
#你可能也喜歡這些API文章!

我們有何不同?

API服務(wù)商零注冊(cè)

多API并行試用

數(shù)據(jù)驅(qū)動(dòng)選型,提升決策效率

查看全部API→
??

熱門場(chǎng)景實(shí)測(cè),選對(duì)API

#AI文本生成大模型API

對(duì)比大模型API的內(nèi)容創(chuàng)意新穎性、情感共鳴力、商業(yè)轉(zhuǎn)化潛力

25個(gè)渠道
一鍵對(duì)比試用API 限時(shí)免費(fèi)

#AI深度推理大模型API

對(duì)比大模型API的邏輯推理準(zhǔn)確性、分析深度、可視化建議合理性

10個(gè)渠道
一鍵對(duì)比試用API 限時(shí)免費(fèi)