DjangoModels
开发流程
- 配置数据库
- 定义模型类(一个模型类对应数据库中一张表)
- 生成迁移文件
- 执行迁移数据表
- 使用模型类进行增删改查
ORM
数据库中数据类型
模型过滤
- filter
- exclude
- 连续使用
- 链式使用
- Person.objects.filter().filter().exclude()
- persons = Person.objects.exclude(p_age__lt=50)
创建模型
class Person(models.Model):
p_name = models.CharField(max_length=16, unique=True)
p_age = models.IntegerField(default=18, db_column='age')
# False 代表男, True代表女
p_sex = models.BooleanField(default=False, db_column='sex')
class Meta:
db_table = 'people'
快捷键
方法
状态码
获取单个对象
- get() 返回一个满足条件的对象
- 获取查询条件没有匹配对象,会抛出异常, DoesNotExit
- 如果查询条件对应多个对象,会抛出异常, MultipObjectsReturned
- count() 返回当前查询集中的对象个数
- exists() 判断查询集中是否有数据
获取first和last
- 默认情况下正常从QuerySet中获取
- 出现bug,需要手写排序规则
切片
- 和python中切片不太一样
- QuerySet[5:15] 获取第五条到第十五条数据
查询集缓存
- filter
- exclude
- all
- 都不会真正的去查询数据库
- 只有在迭代结果集,或者获取单个对象属性,才会去查询数据库
- 懒查询
查询条件
- 属性 __运算符=值
- gt
- lt
- gte
- lte
- in 在某一集合中
- contain 类似于 模糊查询 like
- startswith 以xx开始,本质是 like
- endswith 以xx结束,本质是like
- exzct
- 前面同时添加i,ignore 忽略
- iexact
- icontains
- istartswith
- iendswith
- django中查询条件有时区问题
- 关闭django中自定义时区
- 在数据库中常见对应的时区表
Django中有各种数据库操作,可以便捷对级联的表查询。
grades = Grade.objects.filter(student__s_name="jack") # 查询Jack的班级
result = Customer.objects.aggregate(Max("c_cost")) # 查询最大花费的顾客
F对象
- 可以获得我们属性的值
- 可以获得一个模型不同属性的运算操作
- 还可以支持算术操作
company = Company.objects.filter(c_boy_num__lt=F('c_girl_num')) # 比较男女的人数
Q对象
- 可以对条件进行封装
- 封装后支持逻辑运算
- 与 &
- 或 |
- 非 ~
company = Company.objects.filter(Q(c_boy_num__gt=1) & Q(c_girl_num__gt=5))
模型成员
- 显性属性
- 隐性属性
- 开发者没有书写
- 如果你把隐性属性手动声明了,系统不会再为你产生隐性属性