模型
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>")模型进阶
高级搜索
关联