- 模板同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