數據庫配置
-
創建mysql數據庫:
create database db_django01 charset=utf8;
-
配置mysql
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.mysql', # 數據庫產品
'HOST': "localhost", # 數據庫ip
'PORT': 3306, # 數據庫端口
'USER': "root", # 用戶名
'PASSWORD': "mysql", # 密碼
'NAME': "db_django01", # 數據庫名
}
}
-
安裝 pymysql 第三方包:
pip install pymysql
-
在
與項目同名的包
下的__init__.py
文件中,設置模塊名:import pymysql pymysql.install_as_MySQLdb()
執行遷移命令
- 生成遷移文件:
python manage.py makemigrations
- 生成表:
python manage.py migrate
模型類定義
-
繼承
models.Model
類定義模型類 -
在模型類中定義屬性,格式:
屬性名 = models.字段類型(字段選項)
- 屬性名不能是python 保留關鍵字
- 屬性名不能包含兩個連續的下劃線, 例: 屬性名
__name
不合法
-
默認會自動生成
id
主鍵 -
示例:
class Department(models.Model): name = models.CharField(max_length=20) create_date = models.DateField(auto_now_add=True) is_delete = models.BooleanField(default=False) class Meta: # 指定表名 db_table = 'department' class Employee(models.Model): choices_gender = ( (0, '男'), (1, '女'), ) name = models.CharField(max_length=20) age = models.IntegerField() gender = models.IntegerField(default=0, choices=choices_gender) salary = models.DecimalField(max_digits=8, decimal_places=2) comment = models.CharField(max_length=300, null=True, blank=True) hire_date = models.DateField(auto_now_add=True) department = models.ForeignKey('Department') class Meta: # 指定表名 db_table = 'employee'
模型管理器
管理器中的方法 | 返回類型 | 作用 |
---|---|---|
模型類.objects.create() | 模型類對象 | 創建一個對象(新增一條數據) |
模型類.objects.get() | 模型對象 | 查詢一個對象,且只能有一個: 如果查到多條數據,則報: MultipleObjectsReturned 如果查詢不到數據,則報: DoesNotExist |
模型類.objects.all() | QuerySet | 查詢所有的對象 |
模型類.objects.count() | 數字 | 查詢總共有多少條數據 |
模型類.objects.filter() | QuerySet | 查詢滿足條件的對象 |
模型類.objects.exclude() | QuerySet | 查詢不滿條件的對象 |
模型類.objects.order_by() | QuerySet | 對查詢結果集進行排序 |
模型類.objects.aggregate() | 字典 例如: {‘salary__avg’: 9500.0} |
進行聚合操作 Sum, Count, Max, Min, Avg |
數據增刪改
- 新增
- 方式1:模型類.objects.create(屬性1=值1,屬性2=值2,…)
- 方式2:模型對象.save()
- 刪除
- 方式1:模型類.objects.filter(查詢條件).delete()
- 方式2:模型對象.delete()
- 更新
- 方式1:模型類.objects.filter(查詢條件).update(屬性1=值1,屬性2=值2,…)
- 方式2:模型對象.save()
查詢
條件查詢
用法:模型類.objects.filter(模型類屬性名__比較運算符 = 值)
- 屬性名稱和比較運算符間使用兩個下劃線,所以屬性名不能包括多個下劃線
-
比較運算符
- exact
- contains / endswith / startswith
- isnull
- in
- gt(greater than)、lt(less than)、gte、lte
- year、month、day、week_day、hour、minute、second
-
示例
# 查詢名字包含 ‘馬’ 的員工 Employee.objects.filter(name__contains='馬')
exclude方法
# 例:查詢id不爲3的員工
Employee.objects.exclude(id=3)
F對象
作用:查詢條件中要比較表中的兩個字段
# 例:查詢年齡大於id的員工信息(無實際意義)
select * from employee where age > id;
Employee.objects.filter(age__gt=F('id'))
Q對象
作用:對查詢條件進行 與 或 非 (& | ~) 的邏輯操作
-
與: Q(查詢條件1) & Q(查詢條件2)
-
或: Q(查詢條件1) | Q(查詢條件2)
-
非: ~Q(查詢條件)
示例
Employee.objects.filter(Q(id__gt=3) & Q(age__gt=30)) # 與
Employee.objects.filter(Q(id__gt=3) | Q(age__gt=30)) # 或
Employee.objects.filter(~Q(id=3)) # 非
aggregate`方法
用法: 模型類.objects.aggregate(聚合類(‘屬性名’))
-
常用聚合類有:Sum, Count, Max, Min, Avg等
-
返回值是一個字典, 格式:
{'屬性名__聚合函數': 值}
-
示例:
Employee.objects.aggregate(Avg('salary'))
order_by方法
- 升序: 模型類.objects.order_by(‘屬性名’)
- 降序: 模型類.objects.order_by(’-屬性名’)
關聯查詢
-
通過對象實現
-
一查多
d = Department.objects.get(name=‘研發部’) d.employee_set.all() # 屬性:(多)類名小寫_set
-
多查一
e = Employee.objects.get(name='趙小二') e.department # 關聯屬性
-
-
通過模型類實現
-
一查多:
多類名.objects.filter(關聯屬性__屬性名__條件名=值)
-
多查一:
一類名.objects.filter(多類名小寫__屬性名__條件名=值)
示例
Employee.objects.filter(department__name__exact='研發部') Department.objects.filter(employee__name__exact='趙小二') # 簡寫 Employee.objects.filter(department__name='研發部') Department.objects.filter(employee__name='趙小二')
-
查詢集QuerySet
- 查詢集的方法
get, all, count, filter, exclude, order_by, aggregate, exists - 限制查詢集
- 通過下標取元素
- 切片操作,返回一個新的查詢集
- 下標不能爲負數
- 兩大特性
- 惰性查詢: 用到查詢集中的數據時,纔會去查詢數據庫
- 緩存: 當第一次遍歷使用了查詢集中所有的數據後,django會緩存查詢集中的數據,
下次用到時,讀取緩存