django--模型层(ORM)-建表
要说一个项目最重要的部分是什么那铁定数据了,也就是数据库,这篇就开始带大家走进django关于模型层model的使用,model主要就是操纵数据库不使用sql语句的情况下完成数据库的增删改查。本篇仅带领大家进行简单的建表、查询和删除,因为model的重要性所以后面几篇都会围绕ORM慢慢深入。
本篇导论:
映射关系:
表名 <-------> 类名
字段 <-------> 属性
表记录 <------->类实例对象
1、创建表的代码写在项目下的models文件中
1)比如我们创建一个图书表,建立如下:
from django.db import models
# Create your models here.
class Book(models.Model):
nid = models.AutoField(primary_key=True) #AutoField有序整形 IntegerField整形
title = models.CharField(max_length=32) #CharField字符
author = models.CharField(max_length=32)
publishDate = models.DateField() #DateField日期类型
price = models.DecimalField(max_digits=5, decimal_places=2) #DecimalField浮点型也可以用FloatField
类名就是表名,属性就是字段。继承django提供给我们的用于做转换的models.Model才能将我们写的类转化为数据库
定义好模型之后,你需要告诉Django 使用这些模型。你要做的就是修改配置文件。
2)字段常用参数
2、修改配置文件setting
1)django默认使用的是sqlite3数据库,我们使用的是mysql数据库所以需要修改配置
原先配置(将这些配置注释掉)
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.sqlite3',
'NAME': os.path.join(BASE_DIR, 'db.sqlite3'),
}
}
重新配置
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.mysql',
'NAME': 'blog', #你的数据库名称 数据库需要自己提前建好
'USER': 'root', #你的数据库用户名
'PASSWORD': '', #你的数据库密码
'HOST': '', #你的数据库主机,留空默认为localhost
'PORT': '3306', #你的数据库端口
}
}
3、创建表命令
1)同步更改数据库表或字段
老版本:
python manage.py syncdb
Django 1.7.1 及以上的版本需要用以下命令
python manage.py makemigrations
python manage.py migrate
2)运行python manage.py makemigrations后我们应用下的migrations文件夹里会自动生成一个文件,是将我们写的类进一步转化:
# -*- coding: utf-8 -*-
# Generated by Django 1.11.6 on 2017-10-25 03:30
from __future__ import unicode_literals
from django.db import migrations, models
class Migration(migrations.Migration):
initial = True
dependencies = [
]
operations = [
migrations.CreateModel(
name='Book',
fields=[
('nid', models.AutoField(primary_key=True, serialize=False)),
('title', models.CharField(max_length=32)),
('author', models.CharField(max_length=32)),
('publishDate', models.DateField()),
('price', models.DecimalField(decimal_places=2, max_digits=5)),
],
),
]
3)运行python manage.py migrate后表就插入到我们的数据库中了
4)注意:
如果我们的python是3.x版本运行上面两条会报错
No module named "MySQLdb"
在3.x走数据库用的是pymysql模块所以我们需要告诉django用pymysql
在应用下的__init__.py文件里添加代码
import pymysql
pymysql.install_as_MySQLdb()
运行后在数据库里查看:
会发现django给我们创建了很多表 我们自己创建的Book表会被自动改名为 应用名_book 这样避免了我们在不同的应用中有相同的表,其他的表后面用到时会一一介绍。
1、先在视图函数view中将数据取出来
from app01 import models #app01是应用名
def index(request):
# 从数据库取出所有书籍对象
bookList=models.Book.objects.all() # [bookObj1,.....]
return render(request,"index.html",{"bookList":bookList})
查询相关
<1> all(): 查询所有结果
<2> filter(): 查询所给筛选条件相匹配的对象
2、在template模版中接收
{% for book_obj in bookList %}
<tr>
<td>{{ book_obj.nid }}</td>
<td>{{ book_obj.title }}</td>
<td>{{ book_obj.author }}</td>
<td>{{ book_obj.publishDate|date:"Y-m-d" }}</td>
<td>{{ book_obj.price }}</td>
</tr>
{% endfor %}
删除方法就是 delete()。它运行时立即删除对象而不返回任何值。
比如我们给表中添加一个删除按钮来实现点击按钮后数据库每条记录的删除
1、template模版
{% for book_obj in bookList %}
<tr>
<td>{{ book_obj.nid }}</td>
<td>{{ book_obj.title }}</td>
<td>{{ book_obj.author }}</td>
<td>{{ book_obj.publishDate|date:"Y-m-d" }}</td>
<td>{{ book_obj.price }}</td>
<td>
<a href="/del/{{ book_obj.nid }}"><button class="btn btn-danger">删除</button></a>
</td>
</tr>
{% endfor %}
2、url 分发
urlpatterns = [
url(r'^admin/', admin.site.urls),
url(r'^index/', views.index),
url(r'^del/(\d+)', views.delBook),
]
3、视图函数view实现删除
def delBook(request,id):
models.Book.objects.filter(nid=id).delete()
return redirect("/index/")