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 进行迁移。如下所示,表示更新成功

本节介绍了模型的创建方法,后面将会介绍模型数据的获取方法以及和网页前端的交互




 

				
时间: 2024-11-06 07:08:46

Django之模型的创建的相关文章

使用Django+MySQL+Apache+Linux创建简单的博客

本教程根据慕课网<Django入门与实践>编写 基础知识 什么是django? Django是一个基于Python的高级Web开发框架, 特点:高效,快速,高度集成(不用自己弄底层),免费,开源 上网的流程 输入URL→向目标url发送http请求→服务器把页面响应给浏览器(通过后台编写的代码处理请求)→浏览器解析获取到的页面源代码文档(所以看到的不是html文档)→看到网页 目录结构 项目项目目录结构. ├── manage.py与项目进行交互的命令行工具集的入口(项目管理器) └── my

django的模型类管理器-----------数据库操作的封装

模型实例方法 str():在将对象转换成字符串时会被调用. save():将模型对象保存到数据表中,ORM框架会转换成对应的insert或update语句. delete():将模型对象从数据表中删除,ORM框架会转换成对应的delete语句. 模型类的属性 属性objects:管理器,是Manager类型的对象,用于与数据库进行交互. 当没有为模型类定义管理器时,Django会为模型类生成一个名为objects的管理器,自定义管理器后,Django不再生成默认管理器objects. 管理器是D

Django ORM模型的一点体会

作者:Vamei 出处:http://www.cnblogs.com/vamei 严禁转载. 使用Python的Django模型的话,一般都会用它自带的ORM(Object-relational mapping)模型.这个ORM模型的设计比较简单,学起来不会特别花时间.不过,Django的ORM模型有自己的一套语法,有时候会觉得别扭.这里聊一下我自己的体会. 模型设计 这一部分算处理得比较好的部分.Django的数据模型的建立过程很简单,就是继承django.db.models中的Model类,

django修改模型后更新数据库

当django改变模型过后,需要重新更新数据库,更新方法如下 比如app的名字是rango python manage.py makemigrations rango(创建迁移脚本)  然后运行  python manage.py migrate

Django中模型(二)

Django中模型(二) 三.定义模型 1.模型.属性.表.字段间的关系: 一个模型类在数据库中对应一张表:在模型类中定义的属性,对应该模型对照表中的字段. 2.定义属性 A.概述 ·django根据属性的类型确定以下信息 ·当前选择的数据库支持字段的类型 ·渲染管理表单时使用的默认html控件 ·在管理站点最低限度的验证 B. ·django会为表增加自动增长的主键列,每个模型只能有一个主键列,如果使用选项设置某属性为主键列后,则django不会再生成默认的主键列 C.属性命名限制 ·遵循标识

Django中模型(三)

Django中模型(三) 四.模型成员 1.类属性 objects:是Manager类的一个对象,作用是与数据库进行交互. 定义模型类时,没有定义管理器,则默认创建名为objects的管理器. 2.自定义模型管理器 格式:自定义名=models.Manager() 当为模型定义管理器后,Django将不再为模型生成objects模型管理器. 3.自定义管理器Manager类 概述:模型管理器是Django的模型进行与数据库进行交互个接口,一个模型可以有多个管理器. 作用:向管理器类中添加额外的方

Django中模型(五)

Django中模型(五) 六.模型查询 1.概述 查询集,表示从数据库获取的对象集合. 过滤器就是一个函数,基于所给的参数限制查询集结果.查询集可以有多个过滤器. 从sql角度来说,查询集合等价于select语句,过滤器等价于where条件. 2.查询集 A.概述 在管理器上调用过滤器方法返回查询集.查询集经过过滤器方法筛选后返回新的查询集,所以可以写成链式调用. B.惰式执行 创建查询集不会带来任何数据的访问,直到调用数据时,才会访问数据库 C.直接访问数据库的情况 迭代.序列化.与if合用

Django的模型与字段

Django的模型,包含字段field和操作方法,每个模型在数据库中映射为一张表. 基本原则: 每个model在django中是一个Python类 每个model都是django.db.models.Model的子类 model的每个字段代表数据表中的某一列数据 django自动生成访问数据库的API 通常我们将模型编写在model.py下. 创建了模型之后,在使用它之前,要先在settings文件中的INSTALLED_APPS 处,注册models.py文件所在的app 每次对模型做了增删改

Django之五模型

前言 在第三节,我们讲述了用 Django 建造网站的基本途径: 建立视图和 URLConf . 正如我们所阐述的,视图负责处理一些主观逻辑,然后返回响应结果. 作为例子之一,我们的主观逻辑是要计算当前的日期和时间. 在当代 Web 应用中,主观逻辑经常牵涉到与数据库的交互. 数据库驱动网站 在后台连接数据库服务器,从中取出一些数据,然后在 Web 页面用漂亮的格式展示这些数据. 这个网站也可能会向访问者提供修改数据库数据的方法. 许多复杂的网站都提供了以上两个功能的某种结合. 例如 Amazo