Django之模型的创建
在web应用中,经常涉及到和数据库的的交互,比如我们在京东上买一个东西,查询的时候网站会自动转到后端数据库去查询,然后呈现在网页上
Django 里更关注的是模型(Model)、模板(Template)和视图(Views),Django 也被称为 MTV 框架 。在 MTV 开发模式中:
M 代表模型(Model),即数据存取层。 该层处理与数据相关的所有事务: 如何存取、如何验证有效性、包含哪些行为以及数据之间的关系等。
T 代表模板(Template),即表现层。 该层处理与表现相关的决定: 如何在页面或其他类型文档中进行显示。
V 代表视图(View),即业务逻辑层。 该层包含存取模型及调取恰当模板的相关逻辑。 你可以把它看作模型与模板之间的桥梁。
对于数据库,我们可以用Mysql进行存储,如下面的代码:
def book_list(request):
db = MySQLdb.connect(user='me', db='mydb', passwd='secret', host='localhost')
cursor = db.cursor()
cursor.execute('SELECT name FROM books ORDER BY name')
names = [row[0] for row in cursor.fetchall()]
db.close()
return render('book_list.html', {'names': names})
但是每次进行存储和取数据的时候都得进行数据库连接,不是很方便。好在Django内置了继承了sqlite数据库。我们可以直接使用。在setting.py文件中有如下的默认定义,可以看到引擎使用的是sqlite3,路径在工程路径下,名字是db.sqlite3

在工程界面下,可以看到db.sqlite3文件

Django采用模型在后台执行SQL代码并把结果用python的数据结果来描述。这样的好处是你在写处理函数的时候,只需要考虑python代码,不用再Python和SQL代码之间来回切换。另外由于django可以配置不同的数据库,不同的数据库平台存在兼容性问题,因此使用python描述数据结构可以适用不同的平台
下面我们就来建立自己的模型:
首先在models.py中定义如下数据模型:定义了3个模型,一个是出版商,一个是作者,一个是书籍。从定义中可以看出,每个类型包含不同的属性。且每个属性有不同的类型,比如是字符类的,时间类的。和数据库语言差不多是类似的
比如SQL中建立一个表CREATE TABLE Publisher(name char(30),address char(30))。所以每个模型就可以认为是一个表
class Publisher(models.Model):
name = models.CharField(max_length=30)
address = models.CharField(max_length=50)
city = models.CharField(max_length=60)
state_province = models.CharField(max_length=30)
country = models.CharField(max_length=50)
website = models.URLField() class Author(models.Model):
first_name = models.CharField(max_length=30)
last_name = models.CharField(max_length=40)
email = models.EmailField() class Book(models.Model):
title = models.CharField(max_length=100)
authors = models.ManyToManyField(Author)
publisher = models.ForeignKey(Publisher)
publication_date = models.DateField()
这里解释下ForeignKey和ManyToManyFiled的用法。由于python的模型中封装了数据库的很多表示法,所以django定义了很多参数来表达数据库之间的联系
ForeignKey:一对多的关系。对于一个出版商来说,不可能只出版一本书,因此设置publisher = models.ForeignKey(Publisher)就将每本书和出版商关联了起来。因此ForeignKey的一对多可以理解为一个出版商对应对本书
ManyToManyField:多对多的关系。在一本书里,也许作者并不至一个。有多个作者。那么对于Book来说,定义了authors可以查到这本书所有的作者。而对于Authors这个模型来说,也可以通过这个关联反查到这个作者的所有书籍
另外每个模型都是models.Model的子类,它的父类Model包含了所有和数据库进行交互的方法。
在pycharm的终端上执行python manage.py makemigrations App名字,可以看到系统开始创建数据表
D:\django_test2>python manage.py makemigrations site_prj
Migrations for 'site_prj':
site_prj\migrations\0001_initial.py:
- Create model Author
- Create model Book
- Create model Publisher
- Add field publisher to book
此时才生成initial.py文件

class Migration(migrations.Migration):
initial = True
dependencies = [
]
operations = [
migrations.CreateModel(
name='Author',
fields=[
('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
('first_name', models.CharField(max_length=30)),
('last_name', models.CharField(max_length=30)),
('email', models.EmailField(max_length=254)),
],
),
migrations.CreateModel(
name='Book',
fields=[
('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
('title', models.CharField(max_length=50)),
('publish_date', models.DateField()),
('authors', models.ManyToManyField(to='site_prj.Author')),
],
),
migrations.CreateModel(
name='Publisher',
fields=[
('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
('name', models.CharField(max_length=30)),
('address', models.CharField(max_length=50)),
('city', models.CharField(max_length=20)),
('state_province', models.CharField(max_length=20)),
('country', models.CharField(max_length=30)),
('website', models.URLField()),
],
),
migrations.AddField(
model_name='book',
name='publisher',
field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='site_prj.Publisher'),
),
]
当定义了类型后,后面有需求有添加该如何处理呢。比如我们在出版商Publisher这个模型下面添加一个字段成立日期:
setup_date=models.DateField()
此时添加后,需要同步。在终端上执行python manage.py makemigrationsz首先进行迁移:出现如下提示。意思是这个变量没有一个默认值,选择1表示自行添加一个默认值

此时会进行python界面,输入值后退出。我选择的是timezone.now表示当前时间

再执行python manage.py migrate 进行迁移。如下所示,表示更新成功

本节介绍了模型的创建方法,后面将会介绍模型数据的获取方法以及和网页前端的交互
Django之模型的创建的更多相关文章
- 第四章、Django之模型层---创建模型
目录 第四章.Django之模型层---创建模型 一.写models.py 第四章.Django之模型层---创建模型 一.写models.py from django.db import model ...
- Django 06 Django模型基础1(ORM简介、数据库连接配置、模型的创建与映射、数据的增删改查)
Django 06 Django模型基础1(ORM简介.数据库连接配置.模型的创建与映射.数据的增删改查) 一.ORM系统 #django模型映射关系 #模型类-----数据表 #类属性-----表字 ...
- Django——6 模型基础ORM 数据库连接配置 模型的创建与映射 数据的增删改查
Django Django的ORM简介 数据库连接配置 模型的创建与映射 数据库的增删改查 增数据 查数据及补充 改数据 删数据 Django的ORM系统分析 ORM概念:对象关系映射(Objec ...
- django学习-数据库配置-创建模型
数据库配置 在mysite/settings.py中,包含了django项目设置的python模块 通常,这个配置文件使用SQLite作为默认数据库.如果你不熟悉数据库,或者只是想尝试下django, ...
- Django ORM模型的一点体会
作者:Vamei 出处:http://www.cnblogs.com/vamei 严禁转载. 使用Python的Django模型的话,一般都会用它自带的ORM(Object-relational ma ...
- 64、django之模型层(model)--建表、查询、删除基础
要说一个项目最重要的部分是什么那铁定数据了,也就是数据库,这篇就开始带大家走进django关于模型层model的使用,model主要就是操纵数据库不使用sql语句的情况下完成数据库的增删改查.本篇仅带 ...
- 初识DJango——MTV模型
一.Django—MTV模型 Django的MTV分别代表: Model(模型):负责业务对象与数据库的对象(ORM) Template(模版):负责如何把页面展示给用户 View(视图):负责业务逻 ...
- 【Django】模型层说明
[Django模型层] 之前大概介绍Django的文章居然写了两篇..这篇是重点关注了Django的模型层来进行学习. ■ 模型定义 众所周知,Django中的模型定义就是定义一个类,其基本结构是这样 ...
- django的模型类管理器-----------数据库操作的封装
模型实例方法 str():在将对象转换成字符串时会被调用. save():将模型对象保存到数据表中,ORM框架会转换成对应的insert或update语句. delete():将模型对象从数据表中删除 ...
随机推荐
- redis client API-----------python
想知道redis针对各种编程语言推荐的接口API实现,请参考http://redis.io/clients/ 选择python语言,则使用https://github.com/andymccurdy/ ...
- UE4材质初探
转自:http://www.unrealchina.net/portal.php?mod=view&aid=233 UE4的材质表面上看起来很简单,可是到了用的时候却总是没有办法实现好的效果. ...
- JS和OC间的通信(使用JavaScriptCore)
JavaScriptCore 时代的通讯 iOS 7 开始,苹果提供了一个叫作 JavaScriptCore 的框架,使用 JavaScriptCore 框架可以实现 OC 和 JS 的互相调用,而不 ...
- 使用jmx4perl和j4psh接管Jolokia
在ActiveMQ的API中,内置了Jolokia . 可以使用jmx4perl来安装: $ perl -MCPAN -e shell Terminal does not support AddHis ...
- PD中设置外键约束名称生成规则
选择Database—>Edit Current DBMS选择Scripts->Objects->Reference->ConstName可以发现右侧的Value为: FK_% ...
- 2016.6.18主窗体、子窗体InitializeComponent()事件、Load事件发生顺序以及SeleChanged事件的发生
主窗体,子窗体的InitializeComponent(构造函数).Load事件执行顺序 1.主窗体定义事件 new 主窗体() 构造函数进入主窗体InitializeComponent函数,该函数中 ...
- AFNetworking-2.5-源码阅读剖析--网络请求篇
一.前言 AFNetworking,非常友好简单的网络请求第三方框架,在GitHub中已经获得了25000++的star,链接地址:https://github.com/AFNetworking/AF ...
- opencv 美白磨皮人脸检测<转>
1. 简介 这学期的计算机视觉课,我们组的课程项目为“照片自动美化”,其中我负责的模块为人脸检测与自动磨皮.功能为:用户上传一张照片,自动检测并定位出照片中的人脸,将照片中所有的人脸进行“磨皮”处理, ...
- DAY14-前端之Bootstrap框架
Bootstrap介绍 Bootstrap是Twitter开源的基于HTML.CSS.JavaScript的前端框架. 它是为实现快速开发Web应用程序而设计的一套前端工具包. 它支持响应式布局,并且 ...
- zookeeper 安装配置注意事项
zoo.cfg 1.server.1/2/3 有几台配置几个 2.配置好hosts映射之后可以用node1替代IP地址 3.dataLogDir 下面配置的logs 的目录一定要创建 4.dat ...