- 模板同jinja2,這裏再也不詳述
- ORM配置同redis,也在settings.py文件中配置
- 這裏默認配置爲sqlite
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.sqlite3',
'NAME': os.path.join(BASE_DIR, 'db.sqlite3'),
}
}
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.mysql',
'HOST': '127.0.0.1', # 數據庫主機
'PORT': 3306, # 數據庫端口
'USER': 'root', # 數據庫用戶名
'PASSWORD': 'xxxxx', # 數據庫用戶密碼
'NAME': 'django_test' # 數據庫名字
}
}
- 這裏要注意要使用mysql須要先安裝pymysql: pip install PyMySQL 而後在初始化(在工程下的__init__.py)導入
from pymysql import install_as_MySQLdb
install_as_MySQLdb()
- 模型類均被定義在對應子模塊的models.py中,不一樣子模塊分別定義,模型類一樣須要繼承自Models,須要導入:from django.db import models
- 定義class繼承自models.Model
class Some(models.Model):
title = models.CharField(max_length=20)
class Meta:
db_table = 't_some' # 指明數據庫表名
- 數據庫遷移
- 1.生成遷移文件:python manage.py makemigrations
- 2.遷移到數據庫:python manage.py migrate
- 數據庫操做
- 增
- 1.save:經過模型對象,並給模型對象的屬性賦值,最後調用.save()方法保存
book = User()
user.name = '王麻子'
user.age = 19
book.save()
- 2.create:經過模型類.objects.create()保存
User.objects.create(
name='張三',
age=20
)
- 查
- get :查詢單一結果(通常針對主鍵) 如:User.objects.get(id=10)
- all:查詢所有 如:User.objects.all()
- count:查詢結果數量 如:User.objects.count()
- 條件查詢:
- filter 過濾出多個結果 語法:User.objects.filter(屬性名稱__比較運算符=值) 如:User.objects.filter(id__exact=10) 這裏表示等於,等於時__exact能夠省略不寫
- 比較運算符:__exact 表示等於
- __contains表示包含 如User.objects.filter(name__contains='王') 表示查找名字包含王的
- __startswith、__endswith:以指定值開頭或結尾 如User.objects.filter(name__startswith='張')
- 爲空__isnull 如:User.objects.filter(name__isnull=False) 表示查詢名字不爲空的數據
- 範圍查詢__in 如:User.objects.filter(age__in=[19,20,25]) 表示查詢年齡爲19,20,25的數據
- 比較查詢 大於:__gt 如:User.objects.filter(age__gt=20) 表示查詢age大於20的數據
- 大於等於:__gte
- 小於:__lt
- 小於等於:__lte
- 不等於:使用exclude過濾,即將filter換成exclude 如:User.objects.exclude(id=10) 表示查詢全部id不等於10的數據
- 日期查詢:year、month、day、week_day、hour、minute、second,對日期時間類型的屬性進行運算 如:User.objects.filter(birth__year=1990) 表示查詢birth爲1990年的全部數據
- F對象:須要從django.db.models中導入
- 當要比較兩個屬性時,即等號右邊也是屬性 如:User.objects.filter(age__gt=F('id')) 表示查詢age比id大的全部數據
- 而且F對象能夠直接進行計算 如:User.objects.filter(age__gt=F('id')*2)
- Q對象:表示條件查詢的邏輯與或非關係,Q對象用& | ~來表示與或非(sql裏的and,or,not)
- 與關係簡寫便可 如:User.objects.filter(age__gt=20,id__gt=10) 這裏表示查詢age大於20且id大於10的全部數據
- 或關係:應將兩個條件使用Q對象用|分隔,這裏使用到Q也須要導入 如:User.objects.filter(Q(age__gt=20) | Q(id__gt=10)) 在這裏表示查詢age大於20或者id大於10的全部數據
- 非關係:User.objects.filter(~Q(id=10)) 表示查詢id不等於10的全部數據
- 聚合函數:使用aggregate()過濾器調用聚合函數,聚合函數包括:Avg 平均,Count 數量,Max 最大,Min 最小,Sum 求和 注意使用這些函數時均需導入 如:User.objects.aggregate(sum(age)) 這裏會返回一個字典,鍵的格式爲age_sum,即屬性__函數名,值爲函數運算結果
- 這裏要注意count通常不加aggregate,且只返回一個數字
- 排序:order_by 如:User.objects.all().order_by('age') 這裏是升序,降序只須要將age前面加個減號:User.objects.all().order_by('-age')
- 關聯查詢:一對多,要在一的一端查詢多的一端:一的一端對應的模型類對象.多的一端模型名小寫_set, 在多的一端查詢一的一端:多的一端的模型類對象.定義的關係類屬性名稱(外鍵屬性)
- 改
- save:先查詢一個對象,再給該對象賦值修改,最後使用save保存
user = User.objects.filter(id=10)
user.name='王五'
user.save()
- update:使用模型類.objects.filter().update(),會返回受影響的行數
User.objects.filter(id=10).update(name='王五')
- 刪
user = User.objects.get(id=10)
user.delete
- 模型類.objects.filter().delete() 如: User.objects.filter(id=10).delete