Django 模型
环境
操作系统:Windows 10 64-bit
python版本:python 3.6
数据库:MySQL ( mysql-5.7.23-winx64 )
MySQL下载安装
下载地址: https://www.mysql.com/downloads/ ,安装略
如果想要可视化建库建表,可以下载 MySQL Workbench
启动/关闭 MySQL 服务:
net start/stop mysql
python的mysql模块安装
对于python 2:
pip install mysqlclient
对于python 3:
pip install PyMySQL
python 3 中,需要在settings.py同级目录的__init__.py文件中加入下面的代码:
import pymysql
pymysql.install_as_MySQLdb()
因为 Django 在连接 MySQL 数据库时默认使用的是 MySQLdb 驱动, 然而它并不支持 Python3,需要配置为 pymysql。
数据库配置
在项目的 settings.py 文件中找到 DATABASES 配置项,将其信息修改为:
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.mysql', # 或者 mysql.connector.django
'NAME': 'test', # 数据库名
'USER': 'root', # 数据库用户名
'PASSWORD': 'test123', # 数据库用户密码
'HOST': 'localhost',
'PORT': '3306',
}
}
数据库名和用户信息与 MySQL 中对应数据库和用户的设置相同。
定义模型
Django规定,如果要使用模型,必须要创建一个app,在项目根目录下:
django-admin startapp TestModel #此命令创建一个TestModel的app
修改 TestModel/models.py 文件,添加模型:
# models.py
# 类名即为数据库表名,且继承了models.Model
# 类里面的字段代表数据表中的字段(name),数据类型则由CharField(相当于varchar)、DateField(相当于datetime)
# max_length 参数限定长度
from django.db import models
class Test(models.Model):
name = models.CharField(max_length=20)
在 settings.py 中修改 INSTALLED_APPS:
INSTALLED_APPS = [
'django.contrib.admin',
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.messages',
'django.contrib.staticfiles',
'TestModel', # 添加
]
在命令行中运行:
$ python manage.py migrate # 创建表结构
$ python manage.py makemigrations TestModel # 让 Django 知道我们在我们的模型有一些变更
$ python manage.py migrate TestModel # 创建表结构
至此,数据库表已建好
表名组成结构为:应用名_类名(如:TestModel_test),Django会自动添加一个id作为主键。
PS:如果数据库表已建立,Django可以根据现有数据库建立model:
django-admin startapp app
python manage.py inspectdb > app/models.py
数据库迁移的两大命令:
python manage.py makemigrations
python manage.py migrate
前者是将model层转为迁移文件migrations(存在于app/migrations目录下),后者将新版本的迁移文件执行,更新数据库。这两种命令调用默认为全局,即对所有最新更改的model或迁移文件进行操作。如果想对部分app进行操作,就要在其后追加app name:
python manage.py makemigrations app_name
python manage.py migrate app_name
数据库操作
- 添加数据
# -*- coding: utf-8 -*-
# 此为 testdb.py, 在 settings.py 所在目录下新建
from django.http import HttpResponse
from TestModel.models import Test
# 先创建对象,然后再执行 save 函数,相当于SQL中的INSERT
def testdb(request):
test1 = Test(name='Karmen')
test1.save()
return HttpResponse("<p>数据添加成功!</p>")
- 查询数据
def testdb2(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")
# 上面的方法可以连接使用
Test.objects.filter(name="Karmen").order_by("id")
# 输出所有数据
for var in list:
response1 += var.name + " "
response = response1
return HttpResponse("<p>" + response + "</p>")
- 修改数据
def testdb3(request):
# 修改记录为id=1的name字段,再save,相当于SQL中的UPDATE
test1 = Test.objects.get(id=1)
test1.name = 'Google'
test1.save()
# 另外一种方式
#Test.objects.filter(id=1).update(name='Google')
# 修改所有的行
# Test.objects.all().update(name='Google')
return HttpResponse("<p>修改成功</p>")
- 删除数据
def testdb4(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>")
最后,修改 urls.py:
from django.conf.urls import *
from . import view, testdb
urlpatterns = [
url(r'^hello$', view.hello),
url(r'^testdb$', testdb.testdb),
url(r'^testdb2$', testdb.testdb2),
url(r'^testdb3$', testdb.testdb3),
url(r'^testdb4$', testdb.testdb4),
]
启动服务器:
python manage.py runserver 0.0.0.0:8000
在浏览器访问 http://127.0.0.1:8000/testdb2
,即可实验检测。