前提條件:python
1. 此處假定有一個app叫books,該books的模型定義以下:web
# -*- coding:utf-8 -*- from django.db import models class Publisher(models.Model): name = models.CharField(max_length=30) address = models.CharField(max_length=50) city = models.CharField(max_length=60) state_province = models.CharField(max_length=30) country = models.CharField(max_length=50) website = models.URLField() def __str__(self): #此方法可讓模型知道如何顯示它本身 return self.name class Meta: #此類下的可選項有不少 ordering = ['name'] #指定此類輸出時默認的排序方式(按name排序) class Author(models.Model): first_name = models.CharField(max_length=30) last_time = models.CharField(max_length=40) email = models.EmailField() def __str__(self): return '{first_name} {last_name}'.format(first_name=self.first_name, last_time=self.last_name) class Book(models.Model): title = models.CharField(max_length=100) authors = models.ManyToManyField(Author) publisher = models.ForeignKey(Publisher) publication_date = models.DateField() def __str__(self): return self.title
2. 在一個django項目中,運行 python manage.py shell 進入shell模式sql
在shell命令行中展現基本數據訪問方法:shell
1. 兩步完成對象的建立與存儲至數據庫數據庫
>>> from books.models import Publisher >>> p1=Publisher(name='chuntian',address='123',city='xian',state_province='shanxi',country='china',website='http://www/123.com') #實例化Publisher類,執行此句後,數據庫裏沒有該條數據 >>> p1.save() #調用該對象的save()方法,才能將該數據保存至數據庫
2. 一步到位完成對象的建立與存儲至數據庫django
>>> from books.models import Publisher >>> p2=Publisher.objects.create(name='shine',address='456',city='tianjin',state_province='shanghai',country='china',website='http://www.555.com') #使用create方法,一步到位向數據庫中寫數據
又插入兩條數據後,當前數據庫中的記錄爲:app
3. 獲取對象列表(從給定的模型中取出全部記錄)ui
注:此處得到的結果看起來像一個list,可是它其實是一個QuerySet對象,這個對象是數據庫中一些記錄的集合spa
>>> p_list = Publisher.objects.all() >>> print p_list [<Publisher: ahua>, <Publisher: chuntian>, <Publisher: huaxi>, <Publisher: luoyiren>, <Publisher: shine>, <Publisher: xiaohong>, <Publisher: xiaoming>] #此處獲取到這麼多,是由於我添加的多,就用1.2方法添加的數據
4.數據過濾命令行
注: 此處返回的是一個仿列表(QuerySet),若過濾沒結果,則返回空列表(QuerySet),不會致使異常
>>> cc = Publisher.objects.filter(name='shine') #過濾出name='shine'那條記錄 >>> print cc [<Publisher: shine>]
5.獲取單個對象
注: 此處返回的是單個對象,若結果爲多個對象,會致使拋出異常,若查詢沒結果,也會致使異常
>>> dd = Publisher.objects.get(name='chuntian') #使用get方法獲取單個對象 >>> print dd chuntian
6. 數據排序
默認排序:
>>> dd = Publisher.objects.all() #此處是按模型中指定的默認排序方式 (即模型中寫的按name排序) >>> print dd [<Publisher: ahua>, <Publisher: chuntian>, <Publisher: huaxi>, <Publisher: luoyiren>, <Publisher: shine>, <Publisher: xiaohong>, <Publisher: xiaoming>]
正序:
>>> cc = Publisher.objects.order_by('address') #指定按address排序 >>> print cc [<Publisher: chuntian>, <Publisher: shine>, <Publisher: xiaohong>, <Publisher: xiaoming>, <Publisher: huaxi>, <Publisher: ahua>, <Publisher: luoyiren>] #結果中展現的是name,是由於模型中要求它是用name來展現本身的
逆序:
>>> cc = Publisher.objects.order_by("-address") #按address逆向排序 >>> print cc [<Publisher: xiaoming>, <Publisher: huaxi>, <Publisher: ahua>, <Publisher: luoyiren>, <Publisher: xiaohong>, <Publisher: shine>, <Publisher: chuntian>]
注:此處正序和逆向差異這麼大,是由於有4條記錄的address是相同的,當address相同時,又會按照默認排序進行排序
7. 數據的模糊查找(相似sql中的like查找)
注:like查找的sql語句爲:
SELECT id, name, address, city, state_province, country, website FROM books_publisher WHERE name LIKE '%xiao%';
>>> ff = Publisher.objects.filter(name__contains='xiao') #name和contains之間有雙下劃線,這裏的contains部分會被Django翻譯成like語句 >>> print ff [<Publisher: xiaohong>, <Publisher: xiaoming>] >>>
8. 連鎖查詢 (知足相似 須要同時進行過濾和排序查詢操做 的需求)
>>> cc = Publisher.objects.filter(address='xianla').order_by("-name") #此處既有過濾又有排序 >>> print cc [<Publisher: xiaoming>, <Publisher: luoyiren>, <Publisher: huaxi>, <Publisher: ahua>]
9. 限制返回數據
沒有限制返回結果的:
>>> cc = Publisher.objects.order_by('-name') #按name逆序得到數據 >>> print cc [<Publisher: xiaoming>, <Publisher: xiaohong>, <Publisher: shine>, <Publisher: luoyiren>, <Publisher: huaxi>, <Publisher: chuntian>, <Publisher: ahua>]
有限制返回結果的:
>>> cc = Publisher.objects.order_by('-name')[0:3] #此處相似list中的切片,可是不支持負索引 >>> print cc [<Publisher: xiaoming>, <Publisher: xiaohong>, <Publisher: shine>]
10 . 更新多個對象
指定更新的字段名:
>>> cc = Publisher.objects.filter(name='shine').update(name='myshine') >>> print cc #返回1,說明更新了一條記錄 1 >>> cc = Publisher.objects.filter(address='xianla').update(address='xianan') >>> print cc #返回4,說明更新了4條記錄 4
此時數據庫中的記錄爲:
不指定更新的字段名:
>>> update_data = {'name':'wangxiaohua', 'address':'leshuidadao', 'city':'beijing'} >>> cc = Publisher.objects.filter(name='ahua').update(**update_data) #傳的參數爲字典,更利於代碼複用 >>> print cc 1
此時數據庫中的記錄爲:
11. 刪除對象
方法一:
>>> p = Publisher.objects.get(name='huaxi') >>> p.delete()
此時數據庫中的數據爲:
方法二:
>>> Publisher.objects.filter(name='xiaohong').delete()
方法三:
>>> Publisher.objects.all().delete() #一旦使用all方法,全部數據將會被刪除,慎用