Django操作数据库
setting.py设置:
DATABASES = { 'default': { 'ENGINE': 'django.db.backends.mysql', 'USER': 'user', 'PASSWORD': '密码', 'HOST': 'localhost', 'NAME': 'djangodb' } }
views.py中详解数据的增删改查
from django.shortcuts import render 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('数据修改成功!')
最重要的models.py文件
from django.db import models # Create your models here. """ model.py这个文件中定义的model模型,对应的是数据库中的表及字段。ORM 只要操作数据库,会出现两个新的命令: 1. python manage.py makemigrations 作用:收集model.py文件中发生变化的模型类。执行完这个命令,如果出现No changes detected,说明django没有检测到当前model发生变化。 2. python manage.py migrate 作用:将model模型的这些变化(增删改)同步至数据库中,因为model对应的就是表和字段,所以只要是model发生变化,一定要同步至数据库,保证model和数据库内容一致。 所以:第二个命令python manage.py migrate,在项目第一次运行时必须执行,会生成Django框架内置的数据库到本地。 """ # 如何向数据库中,添加自定义表以及相关字段? # 1. 定义一个model类;该类中声明字段; # 2. 执行makemigrations和migrate命令,将这个model类映射为数据库中的表;model类中的属性映射为表的字段; 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'