ORM
- O:Object对象类
- R:Relations关系,关系数据库中的表
- M:Mapping 映射
ORM基本原理
 通过类和对象操作对应的数据表,不需要sql语句 ORM另一个作用:根据设计的类生成数据库中的表。
模型类和表的生成
在应用里models.py里设计和表对应的类,模型类 模型类的设计必须继承models.Model类 Models.ForeignKey可以建立俩个模型之间的一对多的关系,django在生成表的时候,就会在多的表中创建一列作为外键,建立俩个表之间一对多的关系
在设计完模型类后要生成表需要以下步骤:
- 生成迁移文件
命令:python manage.py makemigrations  
迁移文件是根据模型生成的,会自动生成id这个字段
- 执行迁移生成表
命令:python manage.py migrate
根据迁移文件生成表。 表的默认格式时应用名_模型类名小写 
- 想要数据可视化需要安装一个sqliteman
 如果出现一下问题:  可以试试一下方法安装(在项目目录里执行安装命令,这样启动时直接输入sqliteman 命令就可以运行了): 
通过模型类操作数据表
-
进入项目shell的命令: python manage.py shell
-
首先导入模型类: from 项目名.models import 类名
-
向表中插入或是添加数据:  导入的date是用来格式化时间的 -
查询表中id为1的信息:   -
修改表中id为1的信息:  -
删除id为1的信息: 
模型关系和关系查询
建立关系需要创建一个关系属性
注:# 关系属性 f_book,建立图书类和英雄人物类之间的一对多关系 f_book = models.ForeignKey('BooksInfo') 这段代码用来建立关系,这会自动在表中生成一个外键字段是’关系名_id’ 
- 查询图书表里面的所有内容:
类名.objects.all()  返回的是一个对象列表
Django后台管理页面
设置流程
-
本地化 语言和时间的本地化 修改settings.py文件  -
创建超级管理员 命令:python manage.py createsuperuser -
注册模型类
在应用下的admin.py中注册模型,告诉django框架根据注册的模型类来生成对应表管理页面。
 注:前三步执行后可以进入一个创建了的后台管理页面,在浏览器地址栏输入:http://127.0.0.1:8000/admin  输入设置的超级管理员账户即可登录 进入到一下这个页面:  -
自定义管理页面
自定义模型管理类,模型管理类就是告诉django在生成的管理页面上显示那些内容
from django.contrib import admin
from app_1.models import BooksInfo,FiguresInfo
class BooksInfoAdmin(admin.ModelAdmin):
"""书籍模型管理类"""
list_display = ['id', 'b_title', 'b_date']
class FiguresInfoAdmin(admin.ModelAdmin):
"""人物模型管理类"""
list_display = ['id', 'f_name', 'f_gender', 'f_character', 'f_book']
admin.site.register(BooksInfo, BooksInfoAdmin)
admin.site.register(FiguresInfo, FiguresInfoAdmin)
视图的使用
-
定义视图函数 视图函数定义在views.py中。  视图函数必须有一个参数request,进行处理后,需要返回一个HttpResponse的类对象,'书籍界面’就是返回给浏览器的内容 -
进行url的配置
url配置的目的是让让建立url和视图函数的对应关系,url配置定义在urpatterns的列表中,每一个配置项都调用url函数
  在项目的urls.py文件中包含具体应用的urls.py文件。应用urls.py文件中写url和视图函数的对应关系,这个urls.py文件需要自己创建在这个urls.py文件中要个匹配开头和结尾。 -
最后通过浏览器地址栏访问页面  
模板的使用
-
创建模板文件夹  -
配置模板目录
设置模板目录位置,用绝对位置加上模板目录名,这样不会因改变项目位置而导致模板无法使用
  -
使用模板文件
以下步骤是django render方法的原理
a). 加载模板文件 到模板目录下下面获取html文件的内容,得到一个模板对象。 b). 定义模板上下文 向模板文件传递数据。 c). 模板渲染 得到一个标准的html内容
def my_render(request, template_path, context_dict):
"""使用模板文件"""
temp = loader.get_template('app_1/index.html')
context = RequestContext(request, context_dict)
res_html = temp.render(context)
return HttpResponse(res_html)
实际使用模板是调用django.db 的render方法 def BooksInfo(request):
return render(request, 'app_1/index.html', {'content': '书籍界面', 'list': range(10)})
-
给模板文件传递数据
-
模板变量使用:{{模板变量名}}
- 模板代码段:{%代码段%}
 最终页面展示: 
MVT交互的综合案例
-
项目路由的配置 from django.conf.urls import include, url
from django.contrib import admin
urlpatterns = [
url(r'^admin/', include(admin.site.urls)),
url(r'^', include('app_1.urls')),
]
-
模型类的创建 from django.db import models
class BooksInfo(models.Model):
"""书籍模型"""
b_title = models.CharField(max_length=20)
b_date = models.DateField()
objects = models.Manager()
def __str__(self):
return self.b_title
class FiguresInfo(models.Model):
"""人物信息模型类"""
f_name = models.CharField(max_length=20)
f_gender = models.CharField(max_length=20, default='男')
f_character = models.CharField(max_length=128)
f_book = models.ForeignKey('BooksInfo')
objects = models.Manager()
def __str__(self):
return self.f_name
-
创建交互视图函数 from django.shortcuts import render
from django.http import HttpResponse
from app_1.models import BooksInfo
def BookInfo(request):
books = BooksInfo.objects.all()
return render(request, 'app_1/index2.html', {'books': books})
def show_figures(request, bid):
book = BooksInfo.objects.get(id=bid)
figures = book.figuresinfo_set.all()
return render(request, 'app_1/show_figures.html',
{'figures': figures, 'book': book})
-
函数url路由配置 from django.conf.urls import url
from app_1 import views
urlpatterns = [
url(r'^BookInfo$', views.BookInfo),
url(r'^BookInfo/(\d+)$', views.show_figures),
]
-
模板的设计
-
书籍页面 <!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>图书信息</title>
</head>
<body>
<h1>书籍信息如下:</h1>
<ul>
{% for book in books %}<br>
<li><a href="/BookInfo/{{ book.id }}">{{book.b_title}}</a> </li>
{% endfor %}
</ul>
</body>
-
人物页面 <!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>人物信息</title>
</head>
<body>
<h1>{{book.b_title}}:</h1>
<ul>
{% for figure in figures %}<br>
<li>人物名:{{figure.f_name}}<br>
性别:{{figure.f_gender}}<br>
性格:{{figure.f_character}}</li>
{%empty%}
<li>没有人物信息</li>
{% endfor %}
</ul>
</body>
最终页面展示:  注:pycharm社区版在使用django框架时,模型类里直接调用objects方法会执行不了,可以通过在模板lei里添加objects = models.Manager() 来解决这个问题
|