settings.py 中需要配置的信息
ALLOWED_HOSTS = ["*"]
INSTALLED_APPS 中加入项目下各应用的名称
DATABASES = {
‘default’: {
‘ENGINE’: ‘django.db.backends.mysql’,
‘NAME’: 项目名,
‘USER’: 数据库用户名,
‘PASSWORD’: 数据库用户密码,
‘PORT’: ‘端口号(3306)’,
‘HOST’: ‘主机(localhost)’,
}
}
LANGUAGE_CODE = ‘zh-hans’
TIME_ZONE = ‘Asia/Shanghai’
如果在项目下创建 templates 文件,而不是在应用下面创建,还需要修改:
TEMPLATES 中的 DIRS ,在 DIRS 中添加os.path.join(BASE_DIR, “templates”
开发流程
- 配置数据库
- 定义模型类(一个模型类对应数据库中的一张表)
- 生成迁移文件
- 执行迁移生成数据表
- 使用模型类进行增删改查(CRUD)操作
配置数据库
pip install pymysql
在工程目录下的 init.py 中输入
import pymysql
pymysql.install_as_MySQLdb()
完成数据库驱动加载
Django 定义模型
一个模型类在数据库中对应一张表,在模型类中定义的属性,对应该模型对照表中的一个字段
创建模型类
元选项,在模型类中定义Meta,用于设置元信息
class Meta:
db_table = 'xxx' 定义数据表名,推荐使用小写字母
ordering = [] 对象的默认排序字段,获取对象列表时使用,通常是interger类型,升序ordering["id"],降序ordering["-id"]
Django 默认通过模型的 objects 对象实现模型数据查询
Django 有两种过滤器用于筛选记录
filter 返回符合筛选条件的数据表
exclude 返回不符合筛选条件的数据集
多个 filter 和 exclude 可以连接在一起查询
创建对象
当创建对象时,django不会对数据库进行续写操作,当调用save()方法时才与数据库交互,将对象保存到数据库中
注意:init 已经在父类models.Model中使用,在自定义的模型中无法使用
三种创建对象的方法:
第一种:
person = Person()
person.p_name = xxx
person.p_age = xxx
person.p_sex = xxx
person.save()
第二种:
person = Person.objects.create(p_name="xxx", p_age=xxx, p_sex=xxx)
# person = Person(p_age=xxx)
第三种:
person = Person.create("jack")
person.save()
创建对象方法:
在模型类中增加类方法去创建对象
@classmethod
def create(cls,(数据库表中的数据))
在自定义的管理器中添加方法来创建对象
查询集表示从数据库获取的对象集合
查询集可以有多个过滤器
过滤器就是一个函数,基于所给的参数限制查询集结果
从 SQL 角度来说,查询集合和 select 语句等价,过滤器就像 where 条件
查询经过过滤器筛选后返回新的查询集,所以可以写成链式调用
返回查询集的方法称为过滤器
all() 返回所有数据
filter() 返回符合条件的数据
exclude() 过滤掉符合条件的数据
order_by() 排序
values() 一条数据就是一个字典,返回一个列表
返回单个数据
get(): 返回一个满足条件的对象
如果没有找到符合条件的对象,会引发 模型类 DoesNotExist异常
如果找到多个,会引发 模型类 MultiObjectsReturned 异常
first(): 返回查询集中的第一个对象
last(): 返回查询集中的最后一个对象
count(): 返回当前查询集中的对象个数
exists(): 判断查询集中是否有数据,如果有数据返回True没有反之
# person = Person.objects.get(p_age=98)
# print(person.p_name)
# person = Person.objects.first()
# print(person.p_name)
# person = Person.objects.all().first()
# print(person.p_name)
# person = Person.objects.last()
# print(person.p_name)
# person_one = Person.objects.all().last()
# print(person_one.p_name)
count = Person.objects.count()
限制查询集和查询集的缓存
限制查询集,可以使用下标的方法进行限制,等同于 sql 中的 limit
studentList = Student.objects.all()[0:5] 下标不能是负数
查询集的缓存,每个查询集都包含一个缓存,来最小化对数据库的访问
在新建的查询集中,缓存首次为空,第一次对查询集求值,会发生数据缓存,django 会将查询出来的数据做一个缓存,并返回查询结构,以后的查询直接使用查询集的缓存
filter , exclude , all 都不会真正的去查询数据库,只有我们在迭代结果集,或者获取单个对象值属性的时候,它才会去查阅数据库,称为懒查询
聚合函数
使用 aggregate() 函数返回聚合函数的值
Avg: 平均值
Count: 数量
Max: 最大
Min: 最小
Sum: 求和
Student.objects().aggregate(Max(‘s_age’))
F 对象
可以使用模型的 A 属性与 B 属性进行比较
companys = Company.objects.filter(c_boy_num__lt=F(‘c_girl_num’))
F 对象支持算术运算
companys = Company.objects.filter(c_boy_num__lt=F(‘c_girl_num’)-15)
Q 对象
可以对条件进行封装
封装之后,可以支持逻辑运算
与 & and
或 | or
非 ~ not
模型成员
-
显性属性
开发者手动书写的属性 -
隐性属性
开发者没有书写,ORM自动生成
如果你把隐性属性手动声明了,系统就不会为你自动生成隐性属性了自定义管理器类 模型管理器是Django的模型与数据库进行交互的接口,一个模型可以有多个模型管理器 自定义模型管理器作用: 可以向管理器中添加额外的方法 修改管理器返回的原始查询集 提供创建对象的方式
class AnimalManager(models.Manager):
def get_queryset(self):
return super(AnimalManager, self).get_queryset().filter(is_delete=False)
def creat_animal(self, a_name='chicken'):
a = self.model()
a.a_name = a_name
return a
class Animal(models.Model):
a_name = models.CharField(max_length=16)
is_delete = models.BooleanField(default=False)
a_m = models.Manager()
a_m1 = AnimalManager()
def get_animals(request):
animals = Animal.a_m.filter(is_delete=False)
animals1 = Animal.a_m1.all()
for animal in animals:
print(animal.a_name)
print("xxxxxxxxxxxxxxxxx")
for animal1 in animals1:
print(animal1.a_name)
return HttpResponse("get success")