文章目录
一.DML
1.迁移
(1)迁移默认的13张表
在我们配置好上面的环境时,运行会出现以下红色显示:
这是为了提醒我们django中已经默认有13张表,我们需要将其迁移,可以直接使用:python manage.py migrate
(2)自定义模型的迁移
如果我们要迁移自定义模型,先要生成迁移文件: python manage.py makemigrations,再执行迁移文件: python manage.py migrate
在models中自定义模型:
class Heros(models.Model):
name = models.CharField(max_length=32)
age = models.IntegerField()
在云服务器中输入命令:
运行结果:
注意:
- 如果模型想被迁移,那么模型所在的App,必须要在settings的INSTALLED_APPS中加载。
- django的模型必须继承 models.Model
- 在django中自动定义模型会自动生成主键
- 字符串的长度必须指定
2.模型对象的添加
在django中添加模型对象是非常简单与人性化的
在子路由中添加add路径:
url(r'^add/', views.add)
在视图函数中:
def add(request):
hero=Heros()
hero.name='亚索'
hero.age=18
hero.save()
return HttpResponse('添加成功')
运行结果:
3.模型对象的查询
django的查询是:模型.objects.get/all
现有如下表:
查询单个数据:
在子路由中添加find路径:
url(r'^find/', views.find)
在视图函数中:
def find(request):
a = Heros.objects.get(pk=1)
print(a.name,a.age)
return HttpResponse('查询')
运行结果:
查询所有的数据:
def find(request):
a_list = Heros.objects.all()
print(type(a_list))
for a in a_list:
print(a.name,a.age)
return HttpResponse('查询')
运行结果:
4.模型对象的删除
在子路由中添加delete路径:
url(r'^delete/', views.delete)
在视图函数中:
def delete(request):
# 删除也要基于查询
hero = Heros.objects.get(pk=4)
hero.delete()
return HttpResponse('删除')
运行结果:
5.模型对象的修改
在子路由中添加update路径:
url(r'^update/', views.update)
在视图函数中:
def update(request):
hero=Heros.objects.get(pk=2)
hero.name='锤石'
hero.save()
return HttpResponse('修改')
运行结果:
二.Django Shell
使用:django 终端,
命令:python manager.py shell
作用:集成了django环境的python终端,通常用来调试
三.数据级联
1.一对多模型的创建
这里以班级(Grade)和学生(Student)为例。
在models中创建模型:
class Grade(models.Model):
name = models.CharField(max_length=32)
class Student(models.Model):
name = models.CharField(max_length=32)
#外键
s_grade = models.ForeignKey(Grade)
生成迁移文件并执行:
运行结果:
注意:
- 如果2张表有关联关系,那么带主键的表是主表,带外键的表是从表
- django中自动生成主键,不需要手动设置
- 外键就是从表的某一个字段,去关联主表的主键
2.一对多查询
(1)根据主表对象查询从表数据
现有如下表:
Two_grade:
Two_student:
案例:给一个班级的名字,查询该班级的所有学生。
添加子路由:
url(r'^getStudents/',views.getStudents),
在视图函数中:
def getStudents(request):
grade = Grade.objects.get(pk=1)
student_list = grade.student_set
for student in student_list.all():
print(student.id, student.name)
return HttpResponse('查询成功')
运行结果:
注意:
- 如果是一对多,那么一方是主表,django可以使用一方的对象调用多方模型的小写_set,就可以获取多方所有的数据。
- student表里的对象不能重复,因为id永远不能重复
- student_set的含义:(1)多个值(2)多个值也不会重复
- 思考:Grade这个类的对象没有student_set的属性,那为什么可以调用?
答:如果2张表有主从关系而且还是一对多,那么主表对象有一个属性就是从表模型的小写_set,那么这个属性称为隐性属性。
(2)根据从表对象查询主表数据
案例:给一个学生的名字,查询是哪一个班级的的。
添加子路由:
url(r'^getGrade/',views.getGrade),
在视图函数中:
def getGrade(request):
student = Student.objects.get(pk=4)
name = student.s_grade.name
print(name)
return HttpResponse('查询成功'))
运行结果:
四.元信息
平时我们创建模型时,django自动给我们创建表名:App名_模型名
如何自己创建表名?
class Meta:指定表名和字段名字
db_table = ‘表名’
创建Dog模型:
class Dog(models.Model):
name = models.CharField(max_length=32)
# 元信息
class Meta:
db_table = 'dog'
生成并执行迁移文件
运行结果:
五.字段属性的定义及约束
1.概括
(1)django根据属性的类型确定以下信息:
当前选择的数据库支持字段的类型
渲染管理表单时使用的默认html控件
在管理站点最低限度的验证
(2)django会为表增加自动增长的主键列,每个模型只能有一个主键列,如果使用选项设置某属性为主键列后,则django不会再生成默认的主键列
(3)属性命名限制:
遵循标识符规则
由于django的查询方式,不允许使用连续的下划线
2.库
定义属性时,需要字段类型,字段类型被定义在django.db.models.fields目录下,为了方便使用,被导入到django.db.models中
使用方式:
导入from django.db import models
通过models.Field创建字段类型的对象,赋值给属性
3.逻辑删除
对于重要数据都做逻辑删除,不做物理删除
实现方法是定义isDelete属性,类型为BooleanField,默认值为False
4.字段类型
(1)AutoField
一个根据实际ID自动增长的IntegerField,
通常不指定,如果不指定,一个主键字段将自动添加到模型中
(2)CharField(max_length=字符长度)
字符串,默认的表单样式是 TextInput
(3)TextField
大文本字段,一般超过4000使用,默认的表单控件是Textarea
(4)IntegerField
整数
(5)DecimalField(max_digits=None, decimal_places=None)
使用python的Decimal实例表示的十进制浮点数
参数说明:
DecimalField.max_digits
位数总数
DecimalField.decimal_places
小数点后的数字位数
(6)FloatField
用Python的float实例来表示的浮点数
(7)BooleanField
true/false 字段,此字段的默认表单控制是CheckboxInput
(8)NullBooleanField
支持null、true、false三种值
(9)DateField([auto_now=False, auto_now_add=False])
使用Python的datetime.date实例表示的日期
参数说明:
DateField.auto_now
每次保存对象时,自动设置该字段为当前时间,
用于"最后一次修改"的时间戳,它总是使用当前日期,默认为false
DateField.auto_now_add
当对象第一次被创建时自动设置当前时间,
用于创建的时间戳,它总是使用当前日期,默认为false
说明:
该字段默认对应的表单控件是一个TextInput.
在管理员站点添加了一个JavaScript写的日历控件,
和一个“Today"的快捷按钮,包含了一个额外的invalid_date错误消息键
注意:
auto_now_add, auto_now, and default 这些设置是相互排斥的,
他们之间的任何组合将会发生错误的结果
(10)TimeField
使用Python的datetime.time实例表示的时间,参数同DateField
(11)DateTimeField
使用Python的datetime.datetime实例表示的日期和时间,参数同DateField
(12)FileField
一个上传文件的字段
(13)ImageField
继承了FileField的所有属性和方法,但对上传的对象进行校验,确保它是个有效的image
5.字段选项
通过字段选项,可以实现对字段的约束,在字段对象时通过关键字参数指定
(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, 这个字段在表中必须有唯一值
6.关系
(1)分类
ForeignKey:一对多,将字段定义在多的端中
ManyToManyField:多对多,将字段定义在两端中
OneToOneField:一对一,将字段定义在任意一端中
(2)用一访问多
格式:
对象.模型类小写_set
示例:
grade.students_set
(3)用一访问一
格式:
对象.模型类小写
示例:
grade.students
(4)访问id
格式:
对象.属性_id
示例:
student.sgrade_id
六.模型过滤
1.概括
Django默认通过模型的objects对象实现模型数据查询。
Django有两种过滤器用于筛选记录:
filter: 返回符合筛选条件的数据集
exclude :返回不符合筛选条件的数据集(基本不用)
filter和exclude方法返回的都是一个queryset
2.链式调用
在子路由中添加:
url(r'^testFilter/',views.testFilter),
创建Game模型:
class Game(models.Model):
name = models.CharField(max_length=32)
class Meta:
db_table = 'game'
创建如下表:
在视图函数中:
需求:查询id为3的游戏名
def testFilter(request):
game_list = Game.objects.filter(id=3)
for game in game_list:
print(game.id, game.name)
return HttpResponse('查询成功')
运行结果:
需求:查询id大于3的游戏名
def testFilter(request):
game_list = Game.objects.filter(id__gt=3)
for game in game_list:
print(game.id, game.name)
return HttpResponse('查询成功')
运行结果:
需求:查询id大于等于3的游戏名
def testFilter(request):
game_list = Game.objects.filter(id__gte=3)
for game in game_list:
print(game.id, game.name)
return HttpResponse('查询成功')
运行结果:
需求:查询id不为3的游戏名
def testFilter(request):
game_list = Game.objects.exclude(id=3)
for game in game_list:
print(game.id, game.name)
return HttpResponse('查询成功')
运行结果:
需求:查询id为4的游戏名(要运用filter和exclude)
def testFilter(request):
game_list = Game.objects.exclude(id=3).filter(id__gt=3)
for game in game_list:
print(game.id, game.name)
return HttpResponse('查询成功')
运行结果: