Django 模型

在上一章节中我们学习了 Django 模板的使用。学习了如何使用 模板渲染输出一些数据。在 WEB 日常的运营过程中,都会需要访问各种各样的数据库。

Django 对各种数据库提供了很友好的支持,包括:PostgreSQL、MySQLSQLite、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)
  1. 类名代表了数据库表名,且继承了models.Model

  2. 类里面的字段代表数据表中的字段 (name)

  3. 数据类型则由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>")

输出结果如下图所示:

关于   |   FAQ   |   我们的愿景   |   广告投放   |  博客

  简单教程,简单编程 - IT 入门首选站

Copyright © 2013-2022 简单教程 twle.cn All Rights Reserved.