url(r'^$', views.index) --> 当url中的只有域名的时候,返回index
input type=date --> 显示日期可选的类型
redirect("/") --> 重定向的路径
创建表结构:
class Student(model.Model):
id = models.AutoField(primary_key=True)
--> id字段名,AutoField:int类型,自增 ,primary_key:主键约束
name = models.CharField(max_length=number)
--> name字段名,CharField:char类型,max_length:长度
DateField --> 日期类型
创建完之后在添加,直接在类里面写,并不会报错,而是直接添加,但是要同步数据
单表操作数据:也可以进行链式操作
QuerySet --> ORM的数据类型,格式:列表,里面是对象
models对象 --> 一个具体的对象
stu_list = Student.objects --> 引用objects管理器
添加记录:
方式1:
s = Student(id=xxx,name=xxx,) --> 实例化
s.save() 保存到数据库
方式2:
s = Student.objects.create(id=xxx,name=xxx,)
s 是添加的记录
查询数据:默认是用主键排序,升序
<1> 全部查询
stu_list = Student.objects.all() --> 得到QuerySet类型对象
--> 拿到所有的Student表的记录,返回的是列表,里面是对象
for s in stu_list:
print(s.字段名) --> 取到每条记录的字段
<2> 过滤查询:
stu_list = Student.objects.filter(**kwargs) --> 得到QuerySet类型对象
--> **kwargs --> 字段名=字段值,查询匹配到的记录,返回的是列表,里面是匹配的对象
stu = Student.objects.filter(**kwargs)[0] --> 只拿第一个
models对象
stu_list = Student.objects.filter(birth__year="2014") --> 拿到出生年为2014的
stu_list = Student.objects.filter(birth__year="2014",birth__month="12") --> 拿到出生年为2014和月份为12的
stu_list = Student.objects.filter(name="xxx",class_id="1") --> 拿到name是xxx,class_id是1的记录
<3> 非:拿到和筛选条件不匹配的对象
stu_list = Student.objects.exclude(**kwargs) --> 得到QuerySet类型对象
--> **kwargs 字段名=字段值
<4> 过滤查询结果,只显示要显示的内容 列表中放字典
stu_list = Student.objects.all().values(*field) --> 返回一个ValueQuerySet——一个特殊的QuerySet
返回结果示例:[{"id":"xxx","name":"sss"},{"id":"xxx","name":"sss"}]
运行后得到的并不是一系列model的实例化对象,而是一个可迭代的字典序列
<5> 过滤查询结果,只显示要显示的内容 列表中放元组
stu_list = Student.objects.all().values_list(*field) --> 返回一个ValueQuerySet——一个特殊的QuerySet
返回结果示例:[("xx","sss"),("xx","sss")]
<6> 过滤查询结果,返回结果有且只有一个
stu_list = Student.objects.get(**kwargs) --> 得到models对象
返回结果有且只有一个,如果符合筛选条件的对象超过一个或者没有都会抛出错误。
<7> 返回第一条记录 --> QuerySet对象.first() 得到models对象
stu = Student.objects.all/filter().first()
<8> 返回最后一条记录 --> QuerySet对象.last() 得到models对象
stu = Student.objects.all/filter().last()
<9> 对查询结果排序
stu_list = Student.objects.all().order_by(*field) --> 得到QuerySet类型对象
--> *field 排序的字段,默认升序
--> -*field 排序的字段,加"-"降序
<10> 对查询结果反向排序
stu_list = Student.objects.all().reverse():
<11> 返回查询结果的数量
ret = Student.objects.all().count()
<12> 去重,当查询结果中有重复记录的时候才有意义
stu_list = Student.objects.xxx.distinct()
all(),filter()的查询都没有意义
all().values/values_list()这种的去重有意义
<13> 查看是否有数据
ret = Student.objects.all().exists()
如果QuerySet包含数据,就返回True,否则返回False
转为sql语句中的功能,就是limit,限制查询的条数
删除记录 --> QuerySet对象.delete() 得到models对象
Student.objects.filter(**kwargs).delete() --> 删除所有匹配到的记录
更新记录 --> QuerySet对象.update() 得到models对象
Student.objects.filter(id=xx).update(id=xxx,name=xxx,)
**request.POST --> 作为字典传进去,但是里面的键值对必须要对应
Student.objects.filter(id=xx).update(**request.POST)
单表操作---双下划线查询
stu_list = Student.objects.filter(字段__xx=值)
字段__gt=值 --> 大于
字段__lt=值 --> 小于
字段__contains=值 --> 包含
字段__in=[值,值,值] --> 等于
字段__range=(值,值) --> 范围相当于between and
字段__startswith=值 --> 以xxx为开始
字段__istartswith=值 --> 以xxx为开始,不区分大小写
字段__endswith=值 --> 以xxx为结束
字段__iendswith=值 --> 以xxx为结束,,不区分大小写
多表之间创建关系:
一对多的时候,关联字段放在多的表中
多对多的时候,创建关系表
一对一,关联字段创建在任意表中都可以,关联字段必须唯一约束