Django:查詢基礎語法

未来可期_Durant發表於2024-08-19

一、資料準備

1、在models.py中定義一個新聞和新聞型別的模型類

class NewsInfo(models.Model):
 """新聞表"""
 title = models.CharField(max_length=100, help_text='新聞標題', verbose_name='新聞標題', blank=True, default='')
 content = models.TextField(help_text='內容', verbose_name='內容', blank=True, default='')
 b_date = models.DateField(help_text='日期', verbose_name='日期')
 read = models.IntegerField(help_text='閱讀量', verbose_name='閱讀量', blank=True, default=0)
 good = models.IntegerField(help_text='點贊數量', verbose_name='點贊數量', blank=True, default=0)

class TypeInfo(models.Model):
 """新聞型別"""
 type = models.CharField(max_length=20, help_text='新聞型別', verbose_name='新聞型別')

2、再次生成遷移

python manage.py makemigrations

3、執行遷移

python manage.py migrate

4、登入Django後臺,新增一些練習資料

二、查詢函式

透過模型類.objects屬性可以呼叫如下函式,實現對模型類對應的資料表的查詢

函式名功能返回值說明
get 返回表中滿足條件的一條且只能有一條資料。 返回值是一個模型類物件。 引數中寫查詢條件。1) 如果查到多條資料,則拋異常MultipleObjectsReturned。2)查詢不到資料,則拋異常:DoesNotExist。
all 返回模型類對應表格中的所有資料。 返回值是QuerySet型別 查詢集
filter 返回滿足條件的資料。 返回值是QuerySet型別 引數寫查詢條件。
exclude 返回不滿足條件的資料。 返回值是QuerySet型別 引數寫查詢條件。
order_by 對查詢結果進行排序。 返回值是QuerySet型別 引數中寫根據哪些欄位進行排序。

Django的互動除錯環境

啟動專案,進入互動環境

python manage.py shell

匯入models模組

from news.models import *

查詢單條資料:get

# 查詢id為3的新聞資訊
NewsInfo.objects.get(id=3)

所有資料:all

# 查詢所有新聞資料
NewsInfo.objects.all()

過濾:filter

# 查詢新聞閱讀量為9999的新聞資料:
NewsInfo.objects.filter(read=9999)

不等於:exclude

#查詢所有id不等於1的新聞資料
NewsInfo.objects.exclude(id=1)

排序:oroder_by

#查詢所有新聞資料並且按id進行排序(從小到大)
NewsInfo.objects.all().order_by('id')

#查詢所有新聞資料並且按id進行排序(從大到小)
NewsInfo.objects.all().order_by('-id')

三、查詢集

all, filter, exclude, order_by呼叫這些函式會產生一個查詢集(QuerySet),查詢集可以繼續呼叫上面的所有函式。可以透過exists判斷一個查詢集中是否有資料

查詢集特性

  • 惰性查詢:只有在實際使用查詢集中的資料的時候才會發生對資料庫的真正查詢
  • 快取:當使用的是同一個查詢集時,第一次使用的時候會發生實際資料庫的查詢,然後把結果快取起來,之後再使用這個查詢集時,使用的是快取中的結果
  • 索引取值
    TypeInfo.objects.all()[0]
  • 切片操作
    TypeInfo.objects.all()[0:3]

四、模糊條件查詢

#條件語法格式
模型類.objects.filter(模型類屬性名__條件名=值)

包含:contains

# 查詢名稱裡包含'娛樂’的新聞類別。
TypeInfo.objects.filter(new_type__contains='娛樂')

開頭:startswith

# 查詢以'國'開頭的新聞類別 
TypeInfo.objects.filter(new_type__startswith='')

結尾:endswith

# 查詢以'資訊'結尾的新聞類別
TypeInfo.objects.filter(new_type__endswith='資訊')

範圍查詢:in

# 查詢id為1或3或5的新聞類別
TypeInfo.objects.filter(id__in=[1,3,5])

五、比較查詢

大於:gt

# Demo:查詢id大於3的資料
TypeInfo.objects.filter(id__gt=3)

小於:lt

# Demo:查詢id小於3的資料
TypeInfo.objects.filter(id__lt=3)

大於等於:gte

#Demo:查詢id大於等於5的資料
TypeInfo.objects.filter(id__gte=5)

小於等於:lte

# Demo:查詢id小於等於3的資料
TypeInfo.objects.filter(id__lte=3)   

六、空查詢: isnull

isnull值為True:表示查詢為空的資料,值為False查詢不為空的資料

Demo:查詢標題不為空的新聞.
NewsInfo.objects.filter(title__isnull=False)

相關文章