model.py文件介绍:
model.py这个文件中定义的model模型,对应的是数据库中的表及字段。
操作数据库的两个命令:
1.python manage.py makemigrations 作用:收集model.py文件中发生变化的模型类,执行这个命令,如果出现No change detected,说明django没有检测到当前model发生变化
2.python manage.py migrate 作用:将model模型的这些变化(增删改)同步至数据库中,因为model对应的就是表和字段,所以只要是model发生变化,一定要同步至数据库,保证model和数据库内容一致。
所以:第二个命令python manage.py migrate,在项目第一次运行时必须执行,会生成Django框架内置的数据库到本地。
如何向数据库中,添加自定义表及相关字段?
1.定义一个model类,该类声明字段。
2.执行上面两条命令,生成数据库,表和相应的字段
class People(models.Model):
# primary_key=True: 表示一个table表的主键,既然pid这个字段作为主键,那么这个字段默认带有一些约束:非空、唯一。
# AutoField()表示的是一个自动递增的整数字段,一般用于表示主键。如果model中设置了主键,那么表中就采用model设置的主键。如果Model没有设置主键,表会自动生成一个id主键。
pid = models.AutoField(primary_key=True)
# CharFields must define a 'max_length' attribute.
# max_length:用于设置这个字符串的长度。一般范围在0-255。根据内容长度的大小设置合适的Max_lenght,主要是为了节省内存空间。
user_name = models.CharField(max_length=50)
# null=True 表示数据库中的user_height字段的值可以为空,默认值是False不能为空.
# 但是null的值会受到default的值的影响,如果一个字段没有指定default默认值,那么Django将default的默认值设置为空字符串。空字符串也是表示值存在的。
# Django在加载这些字段的时候,会依次读取每一个字段的默认值default。如果model存在默认值就直接使用,如果model没有指定默认值,会采用Django内部封装的默认值(空字符串'')。
# blank=True 表示html页面中,在填写这个字段时是否必须要填写,True表示页面中这个字段的数据可以忽略不写,False表示页面中这个字段的数据必须要填写。一般这个blank针对的是表单数据。
user_height = models.IntegerField(null=True, blank=True)
# null的值对字段的影响:
# null=False 空:指的是user_name的值不能为NULL(等价于None),保证user_name的值是存在的,即便是一个空字符串也表示值不为空。''也是一个对象。
class Meta:
# 默认的表名是:当前app的名称_模型的名称.
db_table = 'people'
modes.py文件中定义好表之后,在views.py文件中进行增删改查等操作
from django.shortcuts import render
# 导入models.py中设置的类
from .models import People
from django.http import HttpResponse
"""
Django框架的数据库操作:这里的数据库操作并没有采用原始的sql语句的形式,而是采用了ORM技术实现数据的增删改查。这里的ORM指的是对象关系映射(Object Relational Mapping),它是将表与表之间的关系映射为了对象与对象之间的关系,在这里操作对象就是在操作表。所有表的增删改查都是基于对象来完成的。
关系型数据库:多表联查。表与表之间的关系非常重要,表关系映射变成对象关系映射。
通过这种方式操作数据库,可以有效的防止SQL语句注入的风险。
insert into;
delete from student;
() values ();
"""
def insert_data(request):
# 第一种添加数据
# People.objects.create(user_name='张三', user_height=100)
# 第二种添加数据
# p = People(user_name='zs')
# p.save()
# 第三种添加数据
# p = People()
# p.user_name = '李四'
# p.user_height = 170
# p.save()
# 第四种添加数据
# 在创建新的数据之前,先查询数据库中是否已经存在对应的数据,如果已经存在就不再创建这个对象了。可以起到一定的去重作用。
People.objects.get_or_create(user_name='lisi', user_height=180)
return HttpResponse('数据添加成功')
def select_data(request):
# 数据的查询
# 1. 单条数据查询: get(),参数就是查询条件,可以是类中的属性。
# p = People.objects.get(user_name='lisi')
# 2. 多条数据查询:filter(),参数就是查询条件,查询结果是一个结果集QuerySet。
# p = People.objects.filter(user_height=170).first()
# 3. 查询所有数据:all(),返回值也是一个结果集QuerySet。
# p = People.objects.all()
# return render(request, 'index.html', {'p': p})
# 数据的修改
p = People.objects.get(user_name='lisi')
p.user_height = 80
p.save()
# update():参数就是更新的数据。这个函数是更新所有的数据。
People.objects.update(user_height=180)
# 数据的删除
People.objects.get(user_name='lisi').delete()
return HttpResponse('数据修改成功!')
Django框架默认的数据库死sqlite3,如果你需要设置为mysql,可在settings.py文件中设置,有关参数根据自己的实际情况设置
注意:如果你是转移数据库,在之前已经有运行过上面介绍的两条命令了,在再次执行的时候一定要把migrations目录下的文件记录删除,再运行,否则将会报错,因为你之前对数据库的操作会记录在里面,运行时会读取里面的记录。