Django学习4-模型

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()
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值