Django 模型
在上一章节中我们学习了 Django 模板的使用。学习了如何使用 模板渲染输出一些数据。在 WEB 日常的运营过程中,都会需要访问各种各样的数据库。
Django 对各种数据库提供了很友好的支持,包括:PostgreSQL、MySQL、SQLite、Oracle
Django 为这些数据库提供了统一的访问 API。 我们可以根据自己业务需求选择不同的数据库
MySQL 是 Web 应用中最常用的数据库。本章节我们将以 Mysql 作为范例进行介绍。
你可以通过本站的 MySQL 基础教程 进行 MySQL 方面的基础知识学些
Django 访问 MySQL 数据库需要用到 mysqlclient
如果你没安装 mysqlclient 驱动,可以使用以下命令安装
sudo pip install mysqlclient
数据库配置
我们的 HelloWorld 项目需要做一些设置才能访问 MySQL 数据库。
在项目的 settings.py 文件中找到 DATABASES 配置项,将其信息修改为:
HelloWorld/HelloWorld/settings.py: 文件代码:
# -*- coding: UTF-8 -*- ... DATABASES = { 'default': { 'ENGINE': 'django.db.backends.mysql', #或者使用 mysql.connector.django 'NAME': 'test', 'USER': 'root', 'PASSWORD': '', 'HOST': 'localhost', 'PORT': '3306', } } ...
因为我们添加了中文注释,所以需要在 HelloWorld/settings.py 文件头部添加
# -*- coding: UTF-8 -*-
上面的设置中包含数据库名称和用户的信息,与 MySQL 中对应数据库和用户的设置相同。 Django 根据这一设置,与 MySQL 中相应的数据库和用户连接起来
定义模型
创建 APP
Django 规定,如果要使用模型,必须要创建一个app
我们使用以下命令创建一个 DemoModel 的 app:
[root@localhost HelloWorld]# django-admin.py startapp DemoModel
目录结构如下:
[root@localhost HelloWorld]# tree . . ├── DemoModel │ ├── __init__.py │ ├── admin.py │ ├── apps.py │ ├── migrations │ │ └── __init__.py │ ├── models.py │ ├── tests.py │ └── views.py ├── HelloWorld │ ├── __init__.py │ ├── __pycache__ │ │ ├── __init__.cpython-35.pyc │ │ ├── settings.cpython-35.pyc │ │ ├── urls.cpython-35.pyc │ │ ├── view.cpython-35.pyc │ │ └── wsgi.cpython-35.pyc │ ├── settings.py │ ├── urls.py │ ├── view.py │ └── wsgi.py ├── db.sqlite3 ├── manage.py └── templates ├── base.html └── hello.html 5 directories, 21 files
修改 DemoModel/models.py 文件,代码如下:
HelloWorld/TestModel/models.py
#! /usr/bin/python # -*- encoding: utf-8 -*- ''' filename: view.py author: 简单教程(www.twle.cn) copyright: Copyright © 2015-2065 www.twle.cn. All rights reserved. ''' from django.db import models # Create your models here. class Demo(models.Model): name = models.CharField(max_length=20)
-
类名代表了数据库表名,且继承了models.Model
-
类里面的字段代表数据表中的字段 (name)
-
数据类型则由CharField(相当于varchar)、DateField(相当于datetime) max_length 参数限定长度
接下来修改 settings.py 中的 INSTALLED_APPS
:
HelloWorld/HelloWorld/settings.py
INSTALLED_APPS = ( 'django.contrib.admin', 'django.contrib.auth', 'django.contrib.contenttypes', 'django.contrib.sessions', 'django.contrib.messages', 'django.contrib.staticfiles', 'DemoModel', # 添加此项 )
在命令行中运行以下命令:
[root@localhost HelloWorld]# python manage.py makemigrations [root@localhost HelloWorld]# python manage.py migrate # 创建表结构 [root@localhost HelloWorld]# python manage.py makemigrations DemoModel # 让 Django 知道我们在我们的模型有一些变更 [root@localhost HelloWorld]# python manage.py migrate DemoModel # 创建表结构
看到几行 "Creating table…" 的字样,你的数据表就创建好了。
Creating tables ...
...
Creating table DemoModel_demo #我们自定义的表
...
表名组成结构为:应用名_类名(如:DemoModel_demo)
注意
虽然我们没有在 models 给表设置主键,但是 Django 会自动添加一个 id 作为主键
数据库操作
下面,我们要 HelloWorld 目录中添加 demodata.py
文件(下面介绍),并修改 urls.py
为
HelloWorld/HelloWorld/urls.py
#! /usr/bin/python # -*- encoding: utf-8 -*- ''' filename: urls.py author: 简单教程(www.twle.cn) copyright: Copyright © 2015-2065 www.twle.cn. All rights reserved. ''' from django.conf.urls import url from django.contrib import admin from . import view, demodata urlpatterns = [ url(r'^admin/', admin.site.urls), url(r'^hello$', view.hello), url(r'^demo$', demodata.demodata), ]
添加数据
添加数据需要先创建对象,然后再执行 save 函数,相当于 SQL 中的 INSERT
HelloWorld/HelloWorld/demodata.py
#! /usr/bin/python # -*- encoding: utf-8 -*- ''' filename: demodata.py author: 简单教程(www.twle.cn) copyright: Copyright © 2015-2065 www.twle.cn. All rights reserved. ''' from django.http import HttpResponse from DemoModel.models import Demo # 数据库操作 def demodata(request): demo1 = Demo(name='twle') demo1.save() return HttpResponse("<p>数据添加成功!</p>")
访问 http://127.0.0.1:8000/demo 就可以看到数据添加成功的提示
获取数据
Django 提供了多种方式来获取数据库的内容,如下代码所示:
HelloWorld/HelloWorld/sitedata.py
#! /usr/bin/python # -*- encoding: utf-8 -*- ''' filename: demodata.py author: 简单教程(www.twle.cn) copyright: Copyright © 2015-2065 www.twle.cn. All rights reserved. ''' from django.http import HttpResponse from DemoModel.models import Demo # 数据库操作 def sitedata(request): # 初始化 response = "" response1 = "" # 通过objects这个模型管理器的all()获得所有数据行,相当于SQL中的SELECT * FROM list = Demo.objects.all() # filter相当于SQL中的WHERE,可设置条件过滤结果 response2 = Demo.objects.filter(id=1) # 获取单个对象 response3 = Demo.objects.get(id=1) # 限制返回的数据 相当于 SQL 中的 OFFSET 0 LIMIT 2; Demo.objects.order_by('name')[0:2] # 数据排序 Demo.objects.order_by("id") # 上面的方法可以连锁使用 Demo.objects.filter(name="twle").order_by("id") # 输出所有数据 for var in list: response1 += var.name + " " response = response1 return HttpResponse("<p>" + response + "</p>")
输出结果如下图所示:
更新数据
修改数据可以使用 save() 或 update()
HelloWorld/HelloWorld/sitedata.py
#! /usr/bin/python # -*- encoding: utf-8 -*- ''' filename: demodata.py author: 简单教程(www.twle.cn) copyright: Copyright © 2015-2065 www.twle.cn. All rights reserved. ''' from django.http import HttpResponse from DemoModel.models import Demo # 数据库操作 def demodata(request): # 修改其中一个id=1的name字段,再save,相当于SQL中的UPDATE test1 = Demo.objects.get(id=1) test1.name = '简单教程,简单编程' test1.save() # 另外一种方式 # Demo.objects.filter(id=1).update(name='简单教程,简单编程') # 修改所有的列 # Demo.objects.all().update(name='简单教程,简单编程') return HttpResponse("<p>修改成功</p>")
输出结果如下图所示:
删除数据
删除数据库中的对象只需调用该对象的 delete()
方法即可
HelloWorld/HelloWorld/sitedata.py
#! /usr/bin/python # -*- encoding: utf-8 -*- ''' filename: demodata.py author: 简单教程(www.twle.cn) copyright: Copyright © 2015-2065 www.twle.cn. All rights reserved. ''' from django.http import HttpResponse from DemoModel.models import Demo # 数据库操作 def sitedata(request): # 删除id=1的数据 test1 = Demo.objects.get(id=1) test1.delete() # 另外一种方式 # Test.objects.filter(id=1).delete() # 删除所有数据 # Test.objects.all().delete() return HttpResponse("<p>删除成功</p>")
输出结果如下图所示: