Django模型
支持多种数据库,提供了统一的调用API。根据自己业务需求选择不同的数据库。
下以mysql为例
前提:安装mysql,安装pymysql
Django ORM
Django模型使用自带的ORM(对象关系映射:Object Relational Mapping),
作用:实现不同类型系统的数据之间的转换,在业务逻辑层和数据库层之间充当了桥梁作用。
原理:使用描述对象和数据库之间的映射的元数据,将程序中的对象自动持久化到数据库中。
1、ORM将Python代码转成SQL语句
2、SQL语句通过pymysql传送到数据库服务端
3、在数据库中执行SQL语句并将结果返回
好处 | 坏处 |
---|---|
提高开发效率 | ORM代码转换为SQL语句需要一定时间,执行效率会有所下降 |
不同数据库可以平滑切换 | 长期写ORM代码,降低编写SQL语句的能力 |
ORM映射关系表:
数据库配置(以mysql为例)
ORM无法进行库级数操作,只能进行表级操作
先自己建库
create database 数据库名称 default charset=utf8;#为了防止编码出现问题,指定为utf8
并在项目的settings文件中找到DATABASES进行配置
'default':
{
'ENGINE':'django.db.backends.mysql',#数据库引擎
'NAME':'xxx',#数据库名
'HOST':'127.0.0.1',#数据库地址,本机ip为127.0.0.1
'POST':3306,#端口
'USER':'root',#数据库用户名
'PASSWORD':'123456',#数据库密码
}
设置完成后,在settings同级的__init__.py中引入模块和进行配置
import pymysql
pymysql.install_as_MySQLdb()
定义模型
Django规定,如果要使用模型,必须创建一个APP。
命令:
django-admin.py startapp xxx
目录结构如下:
修改其中的models文件
from django.db import models
class Test(models.Model):
name=models.CharField(max_length=20)
上述类名代表了数据库表名,且继承了models.Model,
类里的字段代表着数据表中的字段(name),
数据类型由CharField(相当于varchar)
数据类型参考 https://docs.djangoproject.com/en/3.1/ref/models/fields/#django.db.models.CharField
max_length参数限定长度
再在settings中配置INSTALLED_APPS,如下:
INSTALLED_APPS=(
'django.contrib.admin',
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.messages',
'django.contrib.staticfiles',
'app01',
)
在命令行中运行:
python manage.py migrate #创建表结构
python manage.py makemigrations app01#让Django模型的变更
python manage.py migrate app01 #创建表结构
成功会打印 Creating tables …(表名组成结构为:应用名_类名)
注:即使没有在models中给表设置主键,单Django会自动添加一个id作为主键。
数据库操作
在mysite\mysite目录下创建testdb.py文件,并在urls.py:
from django.urls import path
from . import views,testdb
urlpatterns=[
path('runoob/',views.runoob),
path('testdb/',testdb.testdb),
]
添加数据
添加数据需要先创建对象,然后再执行save函数,相当于SQL中的INSERT:
# _*_coding:utf-8 _*_
from django.http import HttpResponse
from TestModel.models import Test
#数据库操作
def testdb(request):
test1=Test(name='runoob')
test2.save()
return HttpResponse("<p>数据添加成功!</p>")
当访问成功后,会返回数据添加成功的提示
获取数据
from django.http import HttpResponse
from TestModel.models import Test
#数据库操作
def testdb(request):
#初始化
response=""
response1=""
#通过objects这个模型管理器all()获得所有数据行,相当于SQL中的SELECT*FROM
list=Test.objects.all()
#filter相当于SQL中的WHERE,可设置条件过滤结果
response2=Test.objects.filter(id=1)
#获取单个对象
response3=Test.objects.get(id=1)
#限制返回的数据,相当于SQL中的OFFSET 0 LIMIT 2;
Test.objects.order_by('name')[0:2]
#数据排序
Test.objects.order_by("id")
#方法可以连锁使用
#输出所有数据
for var in list:
response1+=var.name+" "
response=response1
return HttpResponse("<p>"+response+"</p>")
更新数据
修改数据可以使用save()或update():
from django.http import HttpResponse
from TestModel.models import Test
#数据库操作
def testdb(request):
#修改其中id=1的name字段,再save,相当于UPDATE
test1=Test.objects.get(id=1)
test1.name='Google'
tesyt.save()
# 另外一种方式
#Test.objects.filter(id=1).update(name='Google')
# 修改所有的列
# Test.objects.all().update(name='Google')
return HttpResponse("<p>修改成功</p>")
删除数据
from django.http import HttpResponse
from TestModel.models import Test
#数据库操作
def testdb(request):
#删除id=1的数据
test1=Test.objects.get(id=1)
test1.delete()
#另外一种方式
#Test.objects.filter(id=1).delete()
#删除所有数据
#Test.objects.all().delete()
return HttpResponse("<p>删除成功</p>")
## 错误信息解决
**出现以下报错**
![在这里插入图片描述](https://img-blog.csdnimg.cn/img_convert/943564045f32c15d0244d4a7f6bc21ed.png#pic_center)
这是因为MySQLclient目前只支持到Python3.4,因此如果使用更高版本的Python,需要进行如下修改:
找到报错base.py文件 将下面两行代码(在文件开头部分)注释:
```python
if version<(1,3,13)
raise ImproperlyConfigured('mysqlclient 1.3.13 or newer is required;you have %s.'%Database.__version__)
出现以下报错
进入报错文件,在报错代码行前加
query=query.encode()