Python Web之路Django(四):模型

Python 2016-02-29

模型

Django对数据库提供很好的致辞,包括:PostgreSQL、MySQL、SQLite、Oracle。其中,MySQL是web应用中最常用的数据库。

数据库配置

修改项目中的setting.py中的DATABASES项:

DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.mysql',
        'NAME': 'test',
        'USER': 'test',
        'PASSWORD': 'test123',
        'HOST':'localhost',
        'PORT':'3306',
    }
}

这里看到服务器报错了:

微信截图_20160229145614.png

意思是没找到MySQQLdb模块,安装MySQLdb,请访问 http://www.codegood.com/archives/129,选择适合您的平台的安装包,分为预编译的二进制文件和源代码安装包。安装后终端import MySQLdb不报错就表示安装成功。

定义模型

Django规定,要使用模型,就必须创建一个app,这个命令与之前不同:

python manage.py startapp test_model

目录结构如下:

learn_django
|-- test_model
|   |-- __init__.py
|   |-- admin.py
|   |-- models.py
|   |-- tests.py
|   `-- views.py

修改test_model/models.py文件,代码如下:

from __future__ import unicode_literals

from django.db import models

# Create your models here.
class TestModel(models.Model):
    name = models.CharField(max_length=20)

类名代表了数据库表名,且需要继承models.Model,类里面的字段代表数据表中的字段(name),数据类型则由CharField(相当于varchar),DateField(相当于datetime),max_length参数限定长度。 接下来在setting.py中找到INSTALLED_APPS这一项:

INSTALLED_APPS = (
    'django.contrib.admin',
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.messages',
    'django.contrib.staticfiles',
    'test_model',               # 添加此项
)

在命令行中运行python manage.py migrate,django1.7以下用syncdb代替migrate

python manage.py makemigrations
python manage.py migrate

表名组成结构为:app名_类名(如:test_model_testmodel)。 注意:尽管我们没有在models给表设置主键,但是Django会自动添加一个id作为主键。

微信截图_20160229150803.png

运行后看数据库,发现多出了好几张表

微信截图_20160229150846.png

数据库操作

在learn_django中新建testdb.py,修改urls.py:

from django.conf.urls import *
from django.contrib import admin
from learn_django.view import *
from learn_django.testdb import *

urlpatterns = [
    url(r'^admin/', admin.site.urls),
    url(r'^hello/', hello),
    url(r'^templates/', templates),
    url(r'^testdb/', testdb),
]

添加数据

添加数据需要先创建对象,然后再执行 save 函数,相当于SQL中的INSERT:

# -*- coding: utf-8 -*-

from django.http import HttpResponse
from test_model.models import TestModel

# 数据库操作
def testdb(request):
    test1 = TestModel(name='w3cschool.cc')
    test1.save()
    return HttpResponse("<p>数据添加成功!</p>")

访问http://localhost:8000/testdb/ 就可以看到数据添加成功的提示。

获取数据

# -*- coding: utf-8 -*-

from django.http import HttpResponse

from test_model.models import TestModel

# 数据库操作
def testdb(request):
    # 初始化
    response = ""
    response1 = ""

    # 通过objects这个模型管理器的all()获得所有数据行,相当于SQL中的SELECT * FROM
    list = TestModel.objects.all()

    # filter相当于SQL中的WHERE,可设置条件过滤结果
    response2 = TestModel.objects.filter(id=1) 

    # 获取单个对象
    response3 = TestModel.objects.get(id=1) 

    # 限制返回的数据 相当于 SQL 中的 OFFSET 0 LIMIT 2;
    TestModel.objects.order_by('name')[0:2]

    #数据排序
    TestModel.objects.order_by("id")

    # 上面的方法可以连锁使用
    TestModel.objects.filter(name="w3cschool.cc").order_by("id")

    # 输出所有数据
    for var in list:
        response1 += var.name + " "
    response = response1
    return HttpResponse("<p>" + response + "</p>")

页面输出结果:

微信截图_20160229155015.png

更新数据

修改数据可以使用 save() 或 update():

# -*- coding: utf-8 -*-

from django.http import HttpResponse

from test_model.models import TestModel

# 数据库操作
def testdb(request):
    # 修改其中一个id=1的name字段,再save,相当于SQL中的UPDATE
    test1 = TestModel.objects.get(id=1)
    test1.name = 'w3cschool菜鸟教程'
    test1.save()

    # 另外一种方式
    #TestModel.objects.filter(id=1).update(name='w3cschool菜鸟教程')

    # 修改所有的列
    # TestModel.objects.all().update(name='w3cschool菜鸟教程')

    return HttpResponse("<p>修改成功</p>")

查询条件

条件选取querySet的时候,

  • filter表示=
  • exclude表示!=
  • querySet.distinct() 去重复
  • __exact 精确等于 like 'aaa'
  • __iexact 精确等于 忽略大小写 ilike 'aaa'
  • __contains 包含 like '%aaa%'
  • __icontains 包含 忽略大小写 ilike '%aaa%',但是对于sqlite来说,contains的作用效果等同于icontains。
  • __gt 大于
  • __gte 大于等于
  • __lt 小于
  • __lte 小于等于
  • __in 存在于一个list范围内
  • __startswith 以...开头
  • __istartswith 以...开头 忽略大小写
  • __endswith 以...结尾
  • __iendswith 以...结尾,忽略大小写
  • __range 在...范围内
  • __year 日期字段的年份
  • __month 日期字段的月份
  • __day 日期字段的日
  • __isnull=True/False

删除数据

删除数据库中的对象只需调用该对象的delete()方法即可:

# -*- coding: utf-8 -*-

from django.http import HttpResponse

from test_model.models import TestModel

# 数据库操作
def testdb(request):
    # 删除id=1的数据
    test1 = TestModel.objects.get(id=1)
    test1.delete()

    # 另外一种方式
    # TestModel.objects.filter(id=1).delete()

    # 删除所有数据
    # TestModel.objects.all().delete()

    return HttpResponse("<p>删除成功</p>")

本文由 hongweipeng 创作,采用 知识共享署名 3.0,可自由转载、引用,但需署名作者且注明文章出处。

如果对您有用,您的支持将鼓励我继续创作!