数据操作:
-
创建数据库:
-
mysql -uroot -p123456
-
create database xxx charset=utf8;
-
1、级联查询
一对多:
#通过学生获取班级信息
student = model.Student.objects.get(pk=1)
grade = student.s_grade
#通过班级获取所有学生信息
grade = model.Grade.objects.get(pk=1)
students = grade.student_set.all()
2、Models 定义
导入from django.db import models
在models中class里面加上
class Meta: db_table = ‘new_name’
可以自己定义数据库表名
创建对象方案:
在模型类中增加类方法去创建对象
@classmethod
def create(cls, p_name, p_age = 100, p_sex=True):
return cls(p_name=p_name, p_age=p_age, p_sex=p_sex)
-
BooleanField 布尔类型 默认false
-
AutoField 根据实际ID自增长的IntegerField
-
CharField(max_length=字符长度) 字符串
-
TextField 大文本字段,一般超过4000使用
-
IntegerField 整数
-
DecimalField(max_digits=None, decimal_places=None) 使用python的Decimal实例表示的十进制浮点数。参数说明:
- DecimalField.max_digits 位数总数
- DecimalField.decimal_places 小数点后的数字位数
-
FloatField 浮点数
-
NullBooleanField 支持null,true,false三种值
-
DateField([auto_now=false, auto_now_add=false])
- 使用python的datetime.date实例表示的日期
- 参数说明:
- auto_now 每次保存对象时,自动设置该字段为当前时间,用于最后修改时间,默认为false
- auto_now_add 第一次创建时自动设置当前时间,默认false
-
TimeField 表示时间,参数同DateField
-
DateTimeField 表示日期和时间,参数同DateField
-
FileField 一个上传文件的字段
-
ImageField 继承了FileField的所有属性和方法,但对上传的对象进行校验,确保它是个有效的image
字段选项:
-
null 如果为True,将会以NULL存储到数据库,默认False
-
blank 如果为True,则该字段允许为空白,默认是False
ps:null是数据库范畴的概念,blank是表单验证范畴的
-
db_column 字段名称,如果未指定,则使用属性的名称
-
db_index 若值为True,则在表中会为此字段创建索引
-
default 默认值
-
primary_key 若为True,则该字段会成为模型的主键字段
-
unique 如果为True,这个字段在表中必须有唯一值
关系分类
-
ForeignKey 一对多,将字段定义在多端
-
ManyToManyField 多对多,将字段定义在两端中
-
OneToOneField 一对一,将字段定义在任意一端中
3、模型成员objects
查询条件
属性__运算符 = 值
-
gt 大于>
-
lt 小于<
-
gte 大于等于>=
-
lte 小于等于<=
-
= 等于
-
in 在某一个集合中
-
contains 包含 类似于模糊查询的like,大小写敏感
-
startswith 以xx开始 本质也是like,大小写敏感
-
endswith 以xx结束 本质也是like,大小写敏感
-
exact 判断,大小写敏感
-
isnull, isnotnull:是否为空
-
前面同时添加i,ignore忽略大小写
-
时间比较运算符:
-
year,month,day,week_day,hour,minute,second
-
查询快捷: pk 代表主键
-
跨关系查询: 模型类名属性名比较运算符,实际上就是处理的数据库中的join
model.Student.create(p_name=”hhh”) #创建 只有调用save后才会在数据库创建数据
model.Student.save() #保存
model.Student.objects.all() #查询所有
model.Student.objects.get(pk=2) #查询单条 必须带条件
model.Student.objects.get(pk=2).delete # 删除
model.Student.objects.filter(condition) #过滤并返回符合条件数据
model.Student.objects.exclude(condition) #过滤并返回不符合条件数据
#ps:连续使用 链式使用
Person.objects.filter().exclude().filter().filter()
返回查询集的方法:
-
all() 返回所有数据
-
filter() 返回符合条件的数据
-
exclude() 过滤掉符合条件的数据
-
order_by 排序
-
values() 一条数据就是一个字典,返回一个列表 将queryset转成一个类似于JSON的格式
-
限制查询集,可以使用下标的方法进行限制等同于sql里面limit
-
student_list =model. Student.Object.all()[0:5] #下标不能为负数,可以防止溢出
返回单个数据:
-
get() 返回一个满足条件的对象,如果没有找到会引发DoesNotExist异常,如果找到多个会引发MultiObjectsReturned异常
-
first() 返回查询集中的第一个对象
-
last() 返回查询集中的最后一个对象
-
count() 返回当前查询集中的对象个数
-
exists() 判断查询集中是否有数据,如果有数据返回True没有反之
F方法:
-
可以获取属性的值
-
可以实现一个模型的不同属性的运算操作
-
还可以支持算术运算
Q对象:
-
过滤器的方法中的关键参数,常用于组合条件
-
年龄小于25
-
model.Student.objects.filter(Q(sage__lt=25))
-
Q对象语法支持 |(or),&(and),,~(取反)
重写all方法:
在models中
class AnimalManager(models.Manager):
def get_queryset(self):
return super(AnimalMamanager, self).get_queryset().filter(is_delete=False)
调用方式:
在model中:
objects = AnimalManager()
在views中:
model.Animal.object.all()