主要内容:
1.model的简单对接,实现数据的增删改查
models使用了ORM技术,对象关系映射,将业务逻辑进行了一个解耦合
如何将迁移文件映射到mysql中?
(1)增:
向数据库中添加数据:
获取学生列表里的数据:
def get_student(request):
students=Student.objects.all()
for student in students:
print(student.s_name)
return HttpResponse('Student List')
(2)查:
将学生的信息显示到网址上:
def get_student(request):
students=Student.objects.all()
for student in students:
print(student.s_name)
context={
"students":students
}
return render(request,'index.html',context=context)
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Student List</title>
</head>
<body>
<h2>CentOS</h2>
<h3>{{students}}</h3>
<h1>Student List</h1>
<ul>
{%for student in students%}
<li>{{student.s_name}}</li>
{%endfor%}
</ul>
</body>
</html>
(3)改:
def update_student(request):
student=Student.objects.get(pk=2)
student.s_name='Jack'
student.save()
return HttpResponse('Student Update Success')
(4)删:
student=Student.objects.get(pk=3)
student.delete()
return HttpResponse('Student Delete Success')
2.数据常规操作—级联数据
(1)这样写的好处是支持模板语言
(2)Django的manage工具提供了shell命令,集成了python环境中的shell终端,帮助我们配置好当前工程的运行环境(如连接好数据库等),以便可以直接在终端中执行测试python语句。
这种方式没有代码提示,但可以帮助我们调试代码
(3)如何看待bug:
1)看日志:先看第一条,再看最后一条;
2)梳理思路:程序在哪一个位置和预期出现偏差
(4)级联数据,外键约束
1)需求:通过学生表获取班级名称:
def get_grade(request):
student=Student.objects.get(pk=3)
grade=student.s_grade
return HttpResponse('Get Grade_Name: %s'%(grade.g_name))
挖坑:
<h2>{{students}}</h2>
2)需求:将班级中所有学生拿出来显示在网页上
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>StudentList</title>
</head>
<body>
<h2>Student_list</h2>
<ul>
{% for student in students %}
<li>{{student.s_name}}</li>
{% endfor %}
</ul>
</body>
</html>
def get_students(request):
grade=Grade.objects.get(pk=1)
students=grade.student_set.all()
context={
'students':students
}
return render(request,'students.html',context=context)
3.ORM&字段类型&约束
(1)ORM:对象关系映射,是一种程序技术,用于实现面向对象编程语言里不同类型系统的数据之间的转换,可以简单理解为翻译机。
(2)字段类型
1)AutoField:一个根据实际ID自动增长的IntegerField,通常不指定。如果指定,一个主键字段将自动添加到模型中;
2)CharField(max_length=字符长度)
字符串,默认的表单样式是TextInput
3)TextField
大文本字段,一般超过4000使用,默认的表单控件是Textarea
4)IntegerFiled
整数
5)DecimalFiled(max_digits=None,decimal_places=None)
使用python的Decimal实例表示的是十进制浮点数
DecimalFiled.max_digits表示位数总数,
DecimalFiled.decimal_places表示小数点后数字位数
6)FloatField
用python的float实例来表示的浮点数
7)BooleanField
true/flase字段,此字段的默认表单控制是CheckboxInput
8)NullBooleanField
支持null,true,flase三种值
9)TimeField
使用python中的datetime.time实例表示的是时间
10)DateTimeField
使用python中的datetime.datetime实例表示的是日期和时间
(3)约束
字段选项:
概述:通过字段选项可以实现对字段的约束,在字段对象时通过关键字指定
1)null:如果为True,Django将空值以null存入到数据库中,默认是False
2)blank:如果为True,则该字段允许为空白,默认是False
注意:null是数据库范畴的概念,blank是表单验证范畴
3)db_column:字段的名称,如果未指定,则使用属性的名称
4)db_index:如果值为True,则在表中会为此字段创建索引
5)default:默认值
6)primary_key:若为True,则该字段会成为模型的主键字段
7)unique:若为True,这个字段在表中必须有唯一值
5.模型成员objects
Django默认通过模型的objects对象实现模型数据查询
Django有两种过滤器用于筛选记录:
filter:返回符合筛选条件的数据集
exclude:返回不符合筛选条件的数据集
多个filter和exclude可以连接在一起查询
persons = Person.objects.filter(p_age__gt=30)表示年龄大于30
persons = Person.objects.filter(p_age__gt=30).filter(p_age__lt=60)b表示年龄大于30小于60
persons = Person.objects.exclude(p_age__lt=50)表示把年龄小于50的踢出去
persons = Person.objects.exclude(p_age__lt=35).filter(p_age__lt=60)表示年龄大于等于35小于60
persons = Person.objects.filter(p_age__in=[49,52,56])
6.创建对象
目的:向数据库中添加数据
当创建对象时,django不会对数据库进行读写操作,当调用save()方法时才会与数据库交互,将对象保存在数据库中。
注意: __ init__已经在父类models.Model中使用,在自定义的模型中无法使用。
创建对象方案:
在模型类中添加类方法去创建对象
@classmethod
def create(cls,name,age):
在自定义的管理器中添加方法来创建对象
创建对象的另一种方法: