一、使用數據庫需要設置settings.py文件。
DATABASES = { 'default': { 'ENGINE': 'django.db.backends.', # Add 'postgresql_psycopg2', 'mysql', 'sqlite3' or 'oracle'. 'NAME': '', # Or path to database file if using sqlite3. 'USER': '', # Not used with sqlite3. 'PASSWORD': '', # Not used with sqlite3. 'HOST': '', # Set to empty string for localhost. Not used with sqlite3. 'PORT': '', # Set to empty string for default. Not used with sqlite3. } }
'ENGINE‘說明使用的是什么數據引擎,django中僅支持'postgresql_psycopg2', 'mysql', 'sqlite3' or 'oracle'.這幾種。
'NAME’使用哪個數據庫,在django中,框架可以生成數據表,但是不可以聲稱數據庫,所以要自己手動創建好數據庫。
'USER'數據庫的用戶名
2、如果django框架支持的操作滿足不了開發需求,可以執行原生的SQL語句。
>>> from django.db import connection >>> cursor = connection.cursor()
3、常用的幾條命令:
python manage.py validate#檢查models是否有語法錯誤
python manage.py startproject projectname
python manage.py startapp appname
python manage.py syncdb#將新建的表創建到數據庫中,但是如果后期對表作了修改,在使用這條命令不會更新。此時應該使用下面兩條命令,僅在django版本》=1.7時使用
python manage.py makemigrations
python manage.py migrate
4、創建models
from django.db import models from django.template.defaultfilters import default class User(models.Model): name =models.CharField(max_length=50); createTime = models.DateTimeField(auto_now=True); updateTime = models.DateTimeField(auto_now_add=True);
5、當使用data=User.objects.all()方法時獲得的是數據表記錄對象的集合,我們可以使用一些有用的字符串來表示這些對象。可以添加一個類方法 __unicode__()
該方法返回一個代表該對象的字符串,是我們能夠看到他就知道是那一條記錄。
注意:該方法返回一個unicode對象,如果不是,比如數字,則返回一個TypeError
def __unicode__(self): return self.name
6、使用User.objects.all()方法返回的數據是QuerySet對象,這個集合是由數據表中的記錄組成的集合。
7、 將結果進行排序使用方法是order_by('name'),可以傳遞一個或多個參數。也可以按照逆序排列,只需要在列名前加一個減號-,例如order_by('-name')。
如果想要將查詢結果默認賦予按照某一列排序,有如下方法:
在models文件的類中添加
class Meta: ordering = ['name']
8、數據結果可以使用切片操作,但不可以使用負數。
Publisher.objects.order_by('name')[0:2]
Publisher.objects.order_by('name')[-1]
Traceback (most recent call last):
... AssertionError: Negative indexing is not supported.
9、QuerySet有update() 方法
Publisher.objects.all().update(country='USA')
10、刪除,使用對象的delete()方法,
>>> p = Publisher.objects.get(name="O'Reilly")
>>> p.delete()
>>> Publisher.objects.all()
[<Publisher: Apress Publishing>]
QuerySet也可以使用delete方法
>>> Publisher.objects.filter(country='USA').delete() >>> Publisher.objects.all().delete() >>> Publisher.objects.all() []
11、獲取QuerySet數據對象的某一列數據使用'.'運算符例如:
對於數據表studentinfo:
class StudentInfo(models.Model): name = models.CharField(max_length = 50,default=""); studentID = models.CharField(max_length=12,default=""); sex = models.CharField(max_length = 5,default=""); age = models.IntegerField(default=0); address = models.TextField(default="");
想要獲取name的值,
objs = StudentInfo.objects.get(studentID = id)#獲取QuerySet對象
objs.name#獲取name值
12 自動添加當前時間到數據庫
時間域的三個類型DateTimeField和DateField和TimeField存儲的內容分別對應着datetime(),date(),time()三個對象。其中有兩個屬性比較重要auto_now=False和auto_now_add=False,默認情況下都是false。
auto_now=Ture,字段保存時會自動保存當前時間,但要注意每次對其實例執行save()的時候都會將當前時間保存,也就是不能再手動給它存非當前時間的值。
auto_now_add=True,字段在實例第一次保存的時候會保存當前時間,不管你在這里是否對其賦值。但是之后的save()是可以手動賦值的。也就是新實例化一個model,想手動存其他時間,就需要對該實例save()之后賦值然后再save()。
13 字段中設置非必填項
有兩個參數可以設置,是blank和null
1)如果是字符串類型的字段,僅設置blank=True即可,當像數據庫中插入數據時,如果沒有提供值,django會自動添加空串到對應字段中。但是對於其他數據類型比如日期、數字等字段則這樣設置會出現錯誤。
2)如果是數字、日期等非字符串類型的字段,想讓他是非必填項,可以設置blank=True,null=True.此時相當於在sql語句中去除了NOT NULL屬性。
14 all():返回包含模式里所有數據庫記錄的QuerySet
filter():返回包含符合指定條件的模型記錄的QuerySet
exclude():和filter相反,查找不符合條件的querySet
get():獲取單個符合條件的記錄,沒有找到或者超過一個結果都會拋出異常。如果沒有則是DoesNotExist,如果是多個結果MultipleObjectsReturned
15 QuerySet是一個容器,類列表的容器,實現了一部分列表的接口,比如執行迭代、索引、切片以及獲取長度len。如果需要也可以使用list(QuerySet)轉換成列表。