通过django操作数据库中表的数据
往表中添加数据:
#新建数据==sql语句中:into app01_userinfo(name,password,age)values("root","123456",16)
userInfo.objects.create(name="root",password="123456",age=16)
在models.py中定义的模型类都会有一个objects属性,它使这个模型在数据库中可以进行查询、创建、修改、删除等操作。
#假如有一个学生表,接下来对这个表进行查询:
#查询学生表中的所有数据,并返回查询集的QuerySet结果集
stus=Student.objects.all()
#查询年龄等于15的学生,并返回查询集的QuerySet结果集
stus=Student.objects.filter(s_age=15)
#查询年龄不等于15的学生,并返回查询集的QuerySet结果集
stus=Student.objects.exclude(s_age=15)
#查询年龄等于15的学生,并返回查询集的QuerySet结果集
stus=Student.objects.get(s_age=15)
#获取所有学生中(按id降序排列)的第一个学生信息
stus=Student.objects.order_by('-id')[0]
stus=Student.objects.order_by('-id').first()
#获取所有学生中(按id降序排列)的最后一个学生信息
stus=Student.objects.order_by('-id').last()
有关于django的模型层的介绍
模型层用于与数据交互,在django开发中,主要以MySQL作为数据持久化的首选数据库。在pycharm中打开models.py文件,在该文件中定义一个模型类Student,如下所示:
from django.db import models
class Student(models.Model):
s_name=models.CharField(max_length=10,unique=True)
s_age=models.IntegerField(default=16)
class Meta:
db_table='student'
注意:模型类中定义了嵌套类Meta,用于向django说明这个模型的各种元标记信息,例如,本例中定义了数据表的名称,还可以定义数据表的默认查询顺序等。
模型类必须继承于models.Model
以下为django中模型的字段定义说明:
1.AutoField:一个根据实际id自动增长的IntegerField,通常不指定。如果不指定,一个主键字段将自动添加的模型中。
2.CharField(max_length=字符长度):字符串。
3.TextField:大文本字段,一般超过4000字符时使用,默认的表单控件是Textarea。
4.IntegerField:整数。
5.DecimalField(max_digits=None,decimal_places=None):使用python的decimal实例表示的十进制浮点数。参数说明:max_digits表示位数总数,decimal_places表示小数点后的数字总数。
6.FloatField:用python的float实例来表示的浮点数。
7.BooleanField:True/Flase字段,此字段的默认表单控制是CheckboxInput。
8.NullBoolField:支持null,True,Flase这3种值。
9.DateField([auto_now=False,auto_now_add=False]):使用python的datatime.date实例表示的日期。参数说明:auto_now表示每次保存对象时,自动设置该字段为当前时间,auto_now_add表示当对象第一次被创建时自动设置当前时间。这两个参数时相互排斥的。
10.TimeField:使用python的datetime.time实例表示的时间。参数同上。
11.DateTimeField:使用python的datetime.datetime实例表示的日期和时间。参数同上。
12.FileField:一个上传文件的字段。
13.ImageField:继承了FileField的所有属性和方法,但对上传的对象会进行校验,确保它是有效的image。
在定义Student类中除了定义字段的类型,,还定义了字段的约束条件,以下是字段约束说明:
1.null:默认为Flase,如果为真,则该字段在数据库中是空数据。
2.blank:默认值为False,如果为真,则该字段允许为空白。
3.db_column:字段的名称,如果未指定,则使用该字段属性的名称。
4.db_index:若为True,则在表中为此字段创建索引。
5.default:默认值。
6.primary_key:为真则为主键。
7.unique:唯一性约束,在表中不能有重复值。
请求Request与响应Response
当web服务器接收到一个来自页面的http请求时,django会把web服务器传过来的请求转化为一个请求对象。在视图函数中,可以从请求Request中获取参数,随后视图会创建并返回一个响应对象Response,django会将这个响应对象Response转化为web服务器可以接受的格式,并将响应发送给客户端。
1.请求Request
在程序中可以通过request.POST和request.GET来判断当前HTTP的请求方式。他们的返回结果均为QueryDict类型,这和python自带的字典类型非常类似,二者都是以键值对的方式存储数据,语法也相同,但是QueryDict中的键可以重复。在QueryDict类型中可以使用getlist方法来获取这些重复的键所对应的值。
#在urls.py中配置路由
path('student/',views.student)
#在views.py文件中,定义视图函数student()
def student(request):
if request.method=='GET':
names=request.GET.getlist('name')
print(type(request.GET))
print(type(names))
return HttpResponse(names)
return HttpResponse("没有获取GET请求")
1.请求request中有一个属性method,可以通过该属性判断用户发送的HTTP请求是GET请求还是POST请求。
2.如果使用request.GET.get('name')方式获取URL中传递的name参数,只能获取到一个,所以如果想获取到全部,就应该使用request.GET.getlist(‘name’)来获取。
QueryDict类型对象和Dict类型对象的不同在于,前者可以有键值重复后者不可以。因此,前者针对获取键值对有两种方法:get()和getlist()方法。
(1)get()方法,使用其会出现下面三种情况:
①如果一个键对应多个值,只能获取到最后一个值。
②如果要获取一个不存在的值,将返回None。
③get()方法获取值也可以简写为dict['键名'],但如果获取的键名不存在,就会抛出异常。
(2)getlist()方法:如果一个键对应多个值,结果以列表返回。
2.响应Response
例,使用响应返回http页面
#在views.py文件中定义视图函数,别忘在urls.py文件中配置路由
def response_html(request):
if request.method=='GET':
res=HttpResponse()
res.write('<html>')
res.write('<head></head>')
res.write('<body>')
res.write('<h2>python</h2>')
res.write('</body>')
res.write('</html>')
return res
return HttpResponse("没有获取到GET请求")
3.重定向redirect
在视图函数中会接受一个请求request,并返回一个响应response,这个响应对象可以不是HttpResponse对象,也可以为HttpResonseRedirect对象,该对象只接受一个参数,即用户将要重定向的URL地址。HttpResonseRedirect的构造函数中可以使用reverse()函数,这个函数可以避免我们硬编码URL,reverse()函数只需要我们提供跳转的namespace命名空间和该视图函数对应的URL模式中的name参数。
语法如下:
HttpResponseRedirect()
简化语法:
redirect()
常用的重定向函数可以传递的参数有相对地址和绝对地址,还可以通过反查得到URL,即reverse("namespace:name")。重定向的使用,有以下四个步骤:
1.在工程目录urls.py文件中定义命名空间:
path('app/',include(('app.urls','app'),namespace='app/'))
2.在urls.py文件中定义name参数:
path(r'redirect_stu/(?P<g_id>\d+)/',views.redirect_stu,name='red_tu'),
re_path(r'student/(\d+)/',views.sel_one_student),
3.在views.py中定义视图函数:
def sel_one_student(request,g_id):
return HttpResponseRedirect(
reverse('app:red_tu',kwargs={'g_id':g_id})
)
def redirect_stu(request,g_id):
if request.method=="GET":
stus=Student.objects.filter(g_id=g_id)
return HttpResponse('查询所用学生信息')
4.在浏览器中访问即可看到查询结果