django模型操做數據庫的經常使用方法——基本數據訪問

前提條件: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方法,全部數據將會被刪除,慎用
相關文章
相關標籤/搜索