Python Web之路:模型

鸡零狗碎 · 08-01

模型
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>")

模型进阶
高级搜索
关联

微信扫码分享

请使用微信扫描二维码分享

表情
爱心
手势
动物
美食
天气

网站已运行 20400 天 | 共有文章 5 篇 | 累计访问 1032 人次