【Django学习笔记】5:使用Django的ORM操作数据库

简述

Django自带的ORM框架操作数据库不需要直接书写SQL语句,类似Hibernate中的面向对象方式。

在这个app下创建一个usedb.py,在其中书写操作数据库的函数,然后在用户做特定的访问时去调用这个函数来测试。在同名子目录下的urls.py中为这个新建的py文件注册路由:

from django.urls import path
# 导入要使用的app的view文件
from lzhapp import views
from lzhapp import usedb

urlpatterns = [
    # 注释掉admin后台的路由
    # path('admin/', admin.site.urls),
    # 使用指定app的路由,指定正则和调用的函数
    path(r'index/', views.index),
    # 配置表单提交的路由
    path(r'gosub/', views.gosub),
    # 新加的操作数据库的路由
    path(r'usedb/',usedb.testdb),
]

然后只要修改刚刚建立的usedb.py中的testdb函数,然后访问该路由指定的url,即

http://localhost:8000/usedb/

即可调用这个函数来操作数据库。

runoob上的Django教程似乎有些老了,虽然也是跟着这个教程学的,但是其中的部分包和用法都已经变了。

插入数据

修改测试文件代码:

# 要使用Http响应
from django.http import HttpResponse
# 要使用模型层的类
from lzhapp.models import UserInfo


def testdb(request):
    # 创建模型层的对象
    usrLzh = UserInfo(usr='lzh', pwd='123')
    # 将该对象持久化到数据库
    usrLzh.save()
    return HttpResponse('添加完成')

页面可以看到输出,数据库中:
这里写图片描述

查询数据

先在数据库中插入几行数据:
这里写图片描述
修改测试文件代码:

# 要使用Http响应
from django.http import HttpResponse
# 要使用模型层的类
from lzhapp.models import UserInfo


def testdb(request):
    # 获取所有数据行
    allRowLst = UserInfo.objects.all()
    print(allRowLst)
    # 使用filter做条件过滤
    testFltr = UserInfo.objects.filter(usr='lzh')
    print(testFltr)
    # 使用get获取单个对象
    testGet = UserInfo.objects.get(pwd='123')
    print(testGet)
    # 排序
    testOrdr = UserInfo.objects.order_by('pwd')
    print(testOrdr)
    return HttpResponse('查询测试完成')

最终控制台输出:

[29/Jun/2018 01:28:47] "GET / HTTP/1.1" 404 2136
<QuerySet [<UserInfo: UserInfo object (1)>, <UserInfo: UserInfo object (2)>, <UserInfo: UserInfo object (3)>]>
<QuerySet [<UserInfo: UserInfo object (1)>]>
[29/Jun/2018 01:28:50] "GET /usedb/ HTTP/1.1" 200 18
UserInfo object (1)
<QuerySet [<UserInfo: UserInfo object (1)>, <UserInfo: UserInfo object (3)>, <UserInfo: UserInfo object (2)>]>

总是穿插一些报错,不清楚什么意思。

更新数据

可以使用save()方法或者update()方法来更新数据。

save方式

修改测试文件代码:

# 要使用Http响应
from django.http import HttpResponse
# 要使用模型层的类
from lzhapp.models import UserInfo


def testdb(request):
    # 获取一个已存在的id的模型类对象
    usrLzh = UserInfo.objects.get(id=1)
    # 修改其其它属性
    usrLzh.pwd = '啊啊啊'
    # save()
    usrLzh.save()
    return HttpResponse('更新测试完成')

数据库中:
这里写图片描述

update方式

修改测试文件代码:

# 要使用Http响应
from django.http import HttpResponse
# 要使用模型层的类
from lzhapp.models import UserInfo


def testdb(request):
    # 获取一个或多个已存在的id的模型类对象的QuerySet,并调用其update方法
    UserInfo.objects.all().update(pwd='123')
    # 要使用filter而不是get,因为get返回的不是QuerySet
    UserInfo.objects.filter(id=1).update(pwd='456')
    return HttpResponse('更新测试完成')

数据库中:
这里写图片描述

删除数据

使用delete()方法,该方法可以对一个模型类的object对象使用,也可以对保存若干该对象的QuerySet使用。

修改测试文件代码:

# 要使用Http响应
from django.http import HttpResponse
# 要使用模型层的类
from lzhapp.models import UserInfo


def testdb(request):
    # 对QuerySet使用
    UserInfo.objects.filter(id=1).delete()
    # 对模型类的object使用
    UserInfo.objects.get(id=2).delete()
    # 要使用filter而不是get,因为get返回的不是QuerySet
    return HttpResponse('删除测试完成')

数据库中:
这里写图片描述

猜你喜欢

转载自blog.csdn.net/shu15121856/article/details/80851094