django自我学习(二)

通过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.在浏览器中访问即可看到查询结果

  • 10
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值